2013-06-04 4 views
4

Я знаю, что Exitthread можно вызывать только внутри Thread, а Abort можно использовать в любое время в любом месте, пока вы можете получить доступ к объекту Thread. Но существуют ли другие существенные различия между этими двумя методами (по работе), когда вам нужно принудительно закрыть Thread?Thread.Abort() vs Application.Exitthread()

ответ

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

+0

Так что если у вас есть роскошь, чтобы выбрать между ними, всегда выбирают ExitThread? – Jordy

+0

Да, но только для потоков, на которых работает насос сообщений (например, основной поток в приложении Windows Forms). Для фоновых задач вы должны использовать отмену сотрудничества, как описано в статье Microsoft, которую я связал. Получение права на отмену прав на удаление часто бывает сложнее, чем вы могли бы подумать вначале. –