Я знаю, что Exitthread можно вызывать только внутри Thread, а Abort можно использовать в любое время в любом месте, пока вы можете получить доступ к объекту Thread. Но существуют ли другие существенные различия между этими двумя методами (по работе), когда вам нужно принудительно закрыть Thread?Thread.Abort() vs Application.Exitthread()
4
A
ответ
6
Да абсолютно.
Thread.Abort()
вызывает ужасные, труднодоступные ошибки и ExitThread()
нет.
Вызов Thread.Abort()
вызывает исключение, которое должно быть выбрано внутри потока, и это может вызвать все виды горя.
Также, конечно, ExitThread()
работает только с потоками, в которых запущены петли сообщений.
Также обратите внимание, что код после вызова ExitThread()
еще будет выполнена, хотя интерфейс вызовов, как MessageBox.Show()
не будет ничего делать:
private void button1_Click(object sender, EventArgs e)
{
Application.ExitThread();
MessageBox.Show("This won't be shown because the UI is being shut down.");
Debug.WriteLine("But this is still executed");
}
Если вы хотите выйти из потоков в управляемом режиме, вам нужно активно поддерживать его, написав код для этого.
Вот хорошая статья Microsoft об этом: http://msdn.microsoft.com/en-us/library/dd997364.aspx
Так что если у вас есть роскошь, чтобы выбрать между ними, всегда выбирают ExitThread? – Jordy
Да, но только для потоков, на которых работает насос сообщений (например, основной поток в приложении Windows Forms). Для фоновых задач вы должны использовать отмену сотрудничества, как описано в статье Microsoft, которую я связал. Получение права на отмену прав на удаление часто бывает сложнее, чем вы могли бы подумать вначале. –