如果某些应用程序退出,我正在尝试使用它ThreadPool.UnsafeRegisterWaitForSingleObject
来通知。它至少可以按我想要的方式工作,但是在我关闭主窗体后,它会抛出异常:
SEHException : 外部组件抛出异常
堆栈跟踪:
at Microsoft.Win32.SafeNativeMethods.CloseHandle(IntPtr handle)
at Microsoft.Win32.SafeHandles.SafeProcessHandle.ReleaseHandle()
at System.Runtime.InteropServices.SafeHandle.InternalFinalize()
at System.Runtime.InteropServices.SafeHandle.Dispose(Boolean disposing)
at System.Runtime.InteropServices.SafeHandle.Finalize()
这是代码:
Load += (s, e) => {
var p = System.Diagnostics.Process.GetProcessById(8524).Handle;
var wh = new ManualResetEvent(false);
wh.SafeWaitHandle = new SafeWaitHandle(p, true);
var cl = ThreadPool.UnsafeRegisterWaitForSingleObject(
wh, new WaitOrTimerCallback((o, b) =>
{
MessageBox.Show("Exited!");
}), null, Timeout.Infinite, true);
};
我什至不需要等待回调被调用,只需运行代码,然后关闭主窗体就会抛出异常。
有趣的是,如果使用OpenProcess
本机函数来获取进程句柄而不是使用这样的Process
类:
//ProcessAccessFlags.Synchronize = 0x00100000
var p = OpenProcess(ProcessAccessFlags.Synchronize, false, 8524);
然后它可以正常工作,没有任何例外,但我不确定在这种情况下是否最好尽可能地坚持托管包装器。另外我想了解为什么在使用Process
类时会引发此异常。看起来Synchronize
标志(记录中的必需标志)是使 usingOpenProcess
和 wrapper 不同的原因Process
。如果在这种情况下看起来Process
无法替换OpenProcess
,或者我在这里错过了什么?
其他信息:Visual Studio 2010,面向 .NET 4.0
谢谢你。