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

9

我有这段代码:

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

如果方法UpdateImage(origin)抛出异常,是需要停止线程还是在异常后它会被停止?谢谢!
5个回答

16

如果UpdateImage抛出异常,很可能会导致整个进程崩溃。任何引发顶级异常的线程都表示存在重大问题。你应该对其进行封装,例如通过在UpdateImage周围放置try/catch并执行适当的操作。是的,如果异常到达线程顶部,该线程将死亡:

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

(或您选择的错误处理方式)

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还是旧版行为,如果进程没有退出,你不需要显式停止线程;异常会使其停止。

3

如果在UpdateImage方法中捕获了异常,除非catch子句明确地从该方法返回,否则该异常不会导致线程停止。

如果未处理,则您的应用程序无论如何都会崩溃-从而导致线程停止;)

最好在UpdateImage方法中放置try...catch块,并在那里执行逻辑错误处理。然后,您可以自行决定是返回并结束线程还是重试。


1

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


1

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

用户线程也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接