C#:异常后停止线程

Posted

技术标签:

【中文标题】C#:异常后停止线程【英文标题】:C#: Stopping a thread after an Exception 【发布时间】:2010-11-10 22:24:32 【问题描述】:

我有这个代码:

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

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

谢谢!

【问题讨论】:

【参考方案1】:

如果UpdateImage 抛出异常,它可能会破坏你的整个进程。任何引发***异常的线程都表明存在大问题。您应该将其包装起来,例如将try/catch 放在UpdateImage 周围并做一些合适的事情。是的,如果异常到达线程的顶部,则线程已死:

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

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

【讨论】:

【参考方案2】:

从 .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 块,并在它所属的地方执行逻辑错误处理。然后你可以自己决定天气返回并结束线程或重试

【讨论】:

【参考方案4】:

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

用户线程也是如此

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于C#:异常后停止线程的主要内容,如果未能解决你的问题,请参考以下文章

c#线程停止

如何停止线程?

如何在 C# 中按下停止按钮来停止耗时过长的 UI 线程 [关闭]

Tomcat 停止线程以避免潜在的内存泄漏

java多线程---停止线程

Java 学习笔记之 异常法停止线程