2009-07-15 5 views
9

У меня есть этот код:C#: Остановка нити после Exception

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

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

Спасибо!

ответ

16

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

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

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

1

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

3

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

Если unhandeled, ваше приложение будет врезаться в любом случае - таким образом, заставляя Thread остановиться;)

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

1

это как основной поток, например, если в основной нити есть исключение, и вы его никто не поймать, поэтому основной поток ' ll завершить и ваше приложение.

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

10

С .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 или устаревшее поведение - если процесс не завершен, вам не нужно явно останавливать поток; исключение остановит его.

Смежные вопросы