C#:在异常后停止一个线程

时间:2009-07-15 08:22:52

标签: c# exception-handling multithreading

我有这段代码:

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

如果方法UpdateImage(origin)抛出异常,则需要停止线程,否则它将在异常后停止?

谢谢!

5 个答案:

答案 0 :(得分:16)

如果UpdateImage抛出异常,则可能会取消整个过程。任何引发顶级异常的线程都表明存在很大问题。你应该把它包起来,例如把try / catch放在UpdateImage附近并做一些合适的事情。是的,如果一个异常到达一个线程的顶部,线程就死了:

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

(或您选择的错误处理)

答案 1 :(得分: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还是遗留行为 - 如果进程没有退出,您都不需要显式停止该线程;例外将阻止它。

答案 2 :(得分:3)

如果在UpdateImage方法的某处捕获该异常,则该异常不会导致该线程停止 - 除非catch子句从该方法显式返回。

如果它是unhandeled,你的应用程序无论如何都会崩溃 - 从而导致Thread停止;)

最好在UpdateImage方法中放置一个try ... catch块,并在它所属的位置执行逻辑错误处理。然后你可以自己决定天气返回并结束线程或者再试一次

答案 3 :(得分:1)

线程将自动终止,因为您没有处理异常,以及您的进程的其余部分,假设您使用.Net 2.0或更高版本(我假设您是由于问题中的C#3语法)。

答案 4 :(得分:1)

它就像主线程一样,例如,如果主线程中发生异常并且没有人捕获它,那么主线程将终止并且你的应用程序。

用户线程也是如此