C #: остановка потока после исключения - PullRequest
9 голосов
/ 15 июля 2009

У меня есть этот код:

Thread t = new Thread(() => UpdateImage(origin));
t.Name = "UpdateImageThread";
t.Start();

Если метод UpdateImage (origin) выдает исключение, необходимо остановить поток или он будет остановлен после исключения?

Спасибо!

Ответы [ 5 ]

16 голосов
/ 15 июля 2009

Если UpdateImage сгенерирует исключение, оно, вероятно, остановит весь ваш процесс. Любой поток, который вызывает исключение верхнего уровня, указывает на большую проблему. Вы должны обернуть это, например, поместив try / catch вокруг UpdateImage и сделав что-нибудь подходящее. И да, если исключение попадает в начало потока, поток считается мертвым:

Thread t = new Thread(() => {
    try {UpdateImage(origin); }
    catch (Exception ex) {Trace.WriteLine(ex);}
});
t.Name = "UpdateImageThread";
t.Start();

(или ваш выбор обработки ошибок)

10 голосов
/ 15 июля 2009

Начиная с .NET 2.0, когда фоновый поток генерирует исключение (которое не обрабатывается), среда выполнения .NET остановит ваш процесс. В приложении Windows.Forms это отличается; Вы можете использовать событие Application.ThreadException, чтобы перехватить исключение.

Это отличалось в .NET 1.0 / 1.1, вы можете прочитать обо всей теме здесь (например, как включить устаревшее поведение в .NET 2.0 или более поздней версии): http://msdn.microsoft.com/en-us/library/ms228965.aspx#ChangeFromPreviousVersions.

Независимо от того, используете ли вы Windows.Forms или устаревшее поведение - если процесс не завершается, вам не нужно явно останавливать поток; исключение остановит его.

3 голосов
/ 15 июля 2009

Исключение не приведет к остановке потока, если он будет перехвачен где-то в методе UpdateImage - если только условие catch явно не возвращается из метода.

Если оно не обработано, ваше приложение все равно будет аварийно завершено, что приведет к остановке потока;)

Лучше всего поместить блок try ... catch в метод UpdateImage и выполнить обработку логических ошибок там, где он принадлежит. Затем вы можете выбрать для себя погоду, чтобы вернуться и закончить тему, или попробуйте снова

1 голос
/ 15 июля 2009

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

То же самое для пользовательских тем

1 голос
/ 15 июля 2009

Поток завершится автоматически, так как вы не обрабатываете исключение вместе с остальной частью вашего процесса, при условии, что вы используете .Net 2.0 или более позднюю версию (что, как я полагаю, связано с синтаксисом C # 3 в вопросе).

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