这是我的简单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()语句上。