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#:异常后停止线程的主要内容,如果未能解决你的问题,请参考以下文章