异常抛出线程池

时间:2011-07-28 13:37:42

标签: c# .net multithreading threadpool

我有一个线程池,我使用一个库,如果满足某些条件则抛出异常。我的问题是,如果这个用完IDE,线程会停止还是整个程序都会停止?

3 个答案:

答案 0 :(得分:3)

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

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

<强>更新

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

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

答案 1 :(得分:3)

让我们回顾一下你的所作所为:

  • 您有一个在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将再次重新抛出异常并拦截它。
  • 所有线程都将暂停,循环将无限期重复。<​​/ li>

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

答案 2 :(得分:1)

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

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

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