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



这是我的简单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");(用throw new System.Exception();抛出System.ComponentModel.Win32Exception)替换,它不会挂起,程序会按预期终止

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

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

更新

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

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

最新更新