【问题标题】:Will main thread catch exception thrown by another thread?主线程会捕获另一个线程抛出的异常吗?
【发布时间】:2011-06-25 04:02:10
【问题描述】:

如果我有这样的代码:

try
{
    Thread t = new Thread(new ThreadStart(wc.LocalRunProcess));
    t.IsBackground = true;
    t.Start();
}
catch (Exception ex)
{
    //do something with ex
}

线程t抛出的异常会被catch块捕获吗?

【问题讨论】:

    标签: c# multithreading exception


    【解决方案1】:

    没有。它不会在您的其他线程t 中捕获任何异常。您必须在该线程中捕获它们并适当地处理它们。

    但是,我相信 AppDomain 的 UnhandedException 事件会报告它。

    【讨论】:

    • Application.ThreadException 用于 WinForms,Application.DispatcherUnhandledException 用于 WPF,AppDomain.UnhandledException 具体而言。
    • @xbonez,另外为了扩展,问题中的代码将启动新线程,然后在新线程刚刚开始执行时继续处理通过 catch 块。
    • @John:啊,真的。之前没想到。
    【解决方案2】:

    看看 System.ComponentModel.BackgroundWorker!它具有异常和取消处理。

    【讨论】:

    • 抱歉,忘记回答问题了。不,catch 不会从另一个线程获取异常。 BackgroundWorker 旨在应对这种情况。
    • 您是说BackgroundWorker 会捕获跨线程的异常。例如,如果在RunWorkAsync 中调用了一个启动另一个线程的方法并且该线程有异常,它会被WorkCompleted 事件处理吗?我正在尝试,它似乎没有抓住它。
    • RunWorkAsync 将在另一个线程上运行代码,因此不需要启动另一个线程。它只会在它正在运行的线程上捕获异常。
    猜你喜欢
    • 2011-12-05
    • 2012-02-10
    • 1970-01-01
    • 2016-07-28
    • 2010-09-16
    • 1970-01-01
    • 2012-05-08
    • 2012-01-11
    • 1970-01-01
    相关资源
    最近更新 更多