2013-02-08 5 views
1

У меня есть поток, вложенный в другой поток в моем коде. в моем закрытии я использую upperThread.Abort(), чтобы закрыть верхнюю нить. однако мой код повесил трубку. Я считаю, что это потому, что мой lowerThread() все еще работает. как я могу закрыть нижний (вложенный) поток, чтобы закрыть приложение правильно?Как закрыть нить, вложенную в поток?

+2

'Thread.Abort()' is * not safe *, и вы не должны использовать его в новом коде. – cdhowie

+2

Ваш вопрос трудно ответить, потому что у вас, кажется, есть ложные убеждения о том, как работают потоки. Нити не «гнездятся». Существует разница между рабочими потоками и потоком пользовательского интерфейса, но эта разница обычно не выражается как отношение «вложенности». В целом, cdhowie абсолютно прав; если вы пишете thread.Abort, вы почти наверняка делаете что-то неправильно. Если вам нужно закрыть поток вниз, тогда придумайте механизм сигнала, посредством которого один поток может закрыть другой вниз вежливо. –

+1

'Thread.Abort' заставляет ребенка плакать. Используйте «Задачу», пожалуйста. – JerKimball

ответ

0

Thread.Abort() не рекомендуется, но может потребоваться в некоторых редких случаях.

Вот простой пример:

var parent = new Thread(new ThreadStart(() => 
{ 
    Thread child = null; 
    try 
    { 
     child = new Thread(new ThreadStart(() => 
     { 
      // do stuff 
     })); 
     child.Start(); 
    } 
    catch (ThreadAbortException) 
    { 
     if (child != null && child.IsAlive) 
     { 
      // Abort child when parent is aborted 
      child.Abort(); 
     } 
    } 
})); 
parent.Start(); 
parent.Abort(); 

Подробнее о ThreadAbortException на MSDN.