是否有可能杀死WaitForSingleObject(句柄,INFINITE)?

Chr*_*lis 7 c# winapi multithreading windows-ce waitforsingleobject

我在关闭使用具有INFINITE timout的WaitForSingleObject()的应用程序时遇到问题.

全貌是这样的.我正在执行以下操作以允许我的应用程序处理设备唤醒事件:

注册活动:

CeRunAppAtEvent("\\\\.\\Notifications\\NamedEvents\\WakeupEvent",
    NOTIFICATION_EVENT_WAKEUP);
Run Code Online (Sandbox Code Playgroud)

启动一个新线程等待:

Thread waitForWakeThread = new Thread(new ThreadStart(WaitForWakeup));
waitForWakeThread.Start();
Run Code Online (Sandbox Code Playgroud)

然后在目标方法中执行以下操作:

private void WaitForWakeup()
{
    IntPtr handle = CreateEvent(IntPtr.Zero, 0, 0, "WakeupEvent");
    while (true)
    {
        WaitForSingleObject(handle, INFINITE);
        MessageBox.Show("Wakey wakey");
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都正常,直到我尝试关闭应用程序时,可以预见,WaitForSingleObject继续等待并且不允许应用程序正常关闭.我们只允许我们的应用程序的一个实例一次运行,我们在启动时检查这个.它似乎继续运行,直到设备软复位.

有没有办法杀死WaitForSingleObject正在等待的句柄,强制它返回?

非常感谢.

Sco*_*ham 18

改为使用WaitForMultipleObject,并传递2个句柄.现有的一个,一个叫做"退出"的事件.在app关闭期间,退出事件上的SetEvent和WaitForMultipleObject将返回,您可以让它正常退出线程.

您需要打开WaitForMultipleObject的返回值以执行适当的行为,具体取决于触发了哪个句柄.

也可以将线程设置为后台线程.这将阻止它在主线程终止时停止应用程序关闭.

看到:

http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx