为什么在.NET线程池中抛出Win32Exception会导致应用程序在调试器下挂起?

时间:2013-11-21 19:55:06

标签: c# .net windows clr

这是我简单的C#控制台应用程序:

using System.Diagnostics;
using System.Threading;

public static class Program
{
    public static int Main(string[] args)
    {
        var e = new AutoResetEvent(false);
        ThreadPool.QueueUserWorkItem(state =>
        {
            Process.Start("nonexistent path");
            e.Set();
        });
        e.WaitOne();
        return 0;
    }
}

如果我在调试器中运行此程序,它将在关闭时挂起。如果我替换行Process.Start("nonexistent path");(将System.ComponentModel.Win32Exceptionthrow new System.Exception();一起抛出),它就不会挂起,程序会按预期终止。

在我看来,.NET / CLR或调试器必须以某种特殊方式处理Win32Exception。这是预期的行为吗?

这是在.NET / CLR 4.0上运行的,其中工作线程上的未处理异常应终止应用程序:CLR 2.0及更高版本(http://msdn.microsoft.com/en-us/library/ms228965.aspx)就是这种情况。

更新

到目前为止,我只能在从Cygwin终端启动程序时在32位Windows操作系统上重现此问题。

1 个答案:

答案 0 :(得分:0)

还有另一个问题:未设置创建ManualResetEvent。因为后台线程在设置ManualResetEvent之前失败,所以主线程卡在@ event.WaitOne()语句上。