У меня есть поток, вложенный в другой поток в моем коде. в моем закрытии я использую upperThread.Abort()
, чтобы закрыть верхнюю нить. однако мой код повесил трубку. Я считаю, что это потому, что мой lowerThread()
все еще работает. как я могу закрыть нижний (вложенный) поток, чтобы закрыть приложение правильно?Как закрыть нить, вложенную в поток?
1
A
ответ
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.
'Thread.Abort()' is * not safe *, и вы не должны использовать его в новом коде. – cdhowie
Ваш вопрос трудно ответить, потому что у вас, кажется, есть ложные убеждения о том, как работают потоки. Нити не «гнездятся». Существует разница между рабочими потоками и потоком пользовательского интерфейса, но эта разница обычно не выражается как отношение «вложенности». В целом, cdhowie абсолютно прав; если вы пишете thread.Abort, вы почти наверняка делаете что-то неправильно. Если вам нужно закрыть поток вниз, тогда придумайте механизм сигнала, посредством которого один поток может закрыть другой вниз вежливо. –
'Thread.Abort' заставляет ребенка плакать. Используйте «Задачу», пожалуйста. – JerKimball