2013-09-27 3 views
1

Я хочу убедиться, что когда мое приложение завершает работу, закрываются все открытые темы. Однако, когда я пытаюсь это сделать, я получаю сообщение об ошибке, указывающее, что нет ссылочного объекта для того, что я пытаюсь сделать, даже если это все в одном классе.Закрытие потоков в Unity с помощью C#

Может кто-то, пожалуйста, помогите мне?

Запуск/открытие темы:

Thread listen_thread; 
TcpListener tcp_listener; 
Thread clientThread; 


// Use this for initialization 
void Start() 
{ 
    IPAddress ip_addy = IPAddress.Parse(ip_address); 
    tcp_listener = new TcpListener(ip_addy, port); 
    listen_thread = new Thread(new ThreadStart(ListenForClients)); 
    listen_thread.Start(); 


    Debug.Log("start thread"); 

} 

Тогда моя попытка их закрытия:

void OnApplicationQuit() 
{ 
    try 
    { 
     clientThread.Abort(); 
     tcp_listener.Stop(); 
     listen_thread.Abort(); 

    } 
    catch(Exception e) 
    { 
     Debug.Log(e.Message); 
    } 
} 

Что я делаю неправильно? Потоки открываются и делают то, что они предполагают, просто отлично, но по какой-то причине я не могу их закрыть.

+0

Мое тестирование (с Unity 5.2 на Windows 7 64-bit) указывает на то, что thread.Abort не работает в Unity, если нить, которая прерывается, не сработает в какой-то момент. Если ваш метод ListenForClients включает Thread.Sleep (0) в своем основном цикле, то Abort должен работать. (Хотя вы не получите ThreadAbortException, что является еще одной ошибкой ...). – yoyo

ответ

2

Вы не должны заставлять нить к Abort, есть много хороших ответов на SO и веб-другом на эту тему, например:

Вместо этого вы должны реализовать шаблон cancalation, например, с помощью Task или BackgroundWorker классов. В этом случае вы в основном говорите: «остановите или сломайте все, что вы делаете, и просто выйдите из метода». Вы также можете развернуть свою собственную реализацию: запросить volatile bool или использовать обработчики событий, но, вероятно, придерживаться уже имеющихся решений. Больше информации в this answer.

Смежные вопросы