ThreadAbortException против изящного выхода из дескриптора события в C#

StackOverflow https://stackoverflow.com/questions/602494

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

Как правило, первый метод предпочтительнее.

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top