我有这段代码:
Thread t = new Thread(() => UpdateImage(origin));
t.Name = "UpdateImageThread";
t.Start();
如果方法UpdateImage(origin)抛出异常,则需要停止线程,否则它将在异常后停止?
谢谢!
答案 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)
它就像主线程一样,例如,如果主线程中发生异常并且没有人捕获它,那么主线程将终止并且你的应用程序。
用户线程也是如此