这是我简单的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.Win32Exception
与throw 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操作系统上重现此问题。
答案 0 :(得分:0)
还有另一个问题:未设置创建ManualResetEvent。因为后台线程在设置ManualResetEvent之前失败,所以主线程卡在@ event.WaitOne()语句上。