ThreadAbortException против изящного выхода дескриптора события в C # - PullRequest
2 голосов
/ 02 марта 2009

При прерывании выполнения потока я всегда сомневаюсь между изящным выходом с обработчиком событий, подобным этому:

int result = WaitHandle.WaitAny(handles);
if (result = WAIT_FINALIZE)
  FinalizeAndExit();

и, используя событие для обозначения потока, оно должно завершиться

или просто обработка исключения ThreadAbortException для завершения потока ...

try
{
  // Main execution
}
catch(ThreadAbortException e)
{
  // FinalizeAndExit();
}
finally
{
}

Я обычно склонен использовать подход ThreadAbortException, поскольку он может быть обработан, но он повторно вызывается в конце блока catch, и это также предотвращает поддержание потока «предательскими» методами, но Я видел оба подхода.

Каково ваше мнение? Есть ли ситуации, когда лучше использовать один над другим, или лучше всегда использовать подход к x?

Ответы [ 3 ]

5 голосов
/ 02 марта 2009

Вообще, первый способ это предпочтительнее.

Трудно (если не невозможно) написать код, который всегда будет корректно обрабатывать исключение ThreadAbortException. Исключение может произойти в середине того, что происходит с потоком, поэтому некоторые ситуации могут быть трудными для обработки.

Например, исключение может возникнуть после того, как вы создали объект FileStream, но до того, как ссылка будет присвоена переменной. Это означает, что у вас есть объект, который должен быть удален, но единственная ссылка на него теряется где-то в стеке ...

2 голосов
/ 02 марта 2009

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

Несмотря на то, что исключения полезны и в некоторых случаях необходимы, они могут и используются чрезмерно.

2 голосов
/ 02 марта 2009

Если я могу попытаться избежать использования Thread.Abort. Проблема с Thread.Abort заключается в том, что это может произойти (почти) в любой строке исполняемого кода и может вызвать некоторое «интересное» поведение (читай: ошибки). Intead Я предпочитаю иметь точку выхода в моем коде, которая проверяет событие или переменную, чтобы увидеть, должен ли поток прекратить работу и изящно завершить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...