繁体   English   中英

线程池中引发异常

[英]Exception Thrown in thread pool

我有一个线程池,并且我使用了一个库,如果满足某些条件,该库将引发异常。 我的问题是,如果这用尽了IDE,线程会停止还是整个程序都停止?

如果应用程序是.Net 2+,则非主线程上的未处理异常将使进程变平。

您可以使用app.config LegacyUnhandledExceptionPolicy设置配置此行为,但我不建议您这样做,因为它可能掩盖严重的错误。

更新

如果您希望忽略偶尔的超时异常,请考虑将WebService调用放在try \\ catch块中,并忽略超时异常:

try
{
    //Call WebService
}
catch(System.Net.WebException ex)
{
   //Ignore
}

因此,让我们回顾一下您拥有的东西:

  • 您有一个在TheadPool线程上执行的方法。
  • 此方法将引发异常。
  • try-catch块不会处理该异常。
  • 该应用程序正在IDE外部运行。

现在,我们可以使用以下代码轻松进行测试。 请仔细注意以下观察,特别是大胆的观察,因为它们在您的问题中很有趣。

public static void Main()
{
    ThreadPool.QueueUserWorkItem(
        (state) =>
        {
            throw new InvalidOperationException();
        }, null);

    while (true)
    {
       Thread.Sleep(1000);
       Console.WriteLine(DateTime.Now.ToString());
    }
}

在IDE外部运行时,您将看到以下内容。

  • 将出现一个对话框,指出“ [应用程序]遇到问题,需要关闭。给您带来的不便,我们深表歉意。”
  • 该应用程序将继续运行并每秒打印当前时间。
  • 单击对话框上的关闭 ,应用程序将终止。

在IDE 1中运行时,您将看到以下内容。

  • IDE将拦截该异常,并使用其自己的未处理异常窗口显示该异常。
  • 所有线程将被暂停,这意味着您将看不到当前时间。
  • 忽略异常并恢复调试会话将允许当前时间开始显示。
  • IDE将再次抛出该异常并对其进行拦截。
  • 所有线程将被暂停,并且循环将无限期重复。

1我使用Visual Studio 2010对此进行了测试。

当调试器中断程序时,所有线程都将停止。

Debug -> Windows -> Threads屏幕中,您可以看到线程。 您可以“冻结”线程,这意味着如果继续运行该程序,它将保持暂停状态。

因此,即使调试器运行,也可以使某些线程停止。 相反是不可能的:当调试器处于中断模式时,没有线程可以运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM