我在关闭使用带有INTIMITE timout的WaitForSingleObject()的应用程序时遇到问题。

完整的图片是这个。我正在执行以下操作以允许我的应用程序处理设备唤醒事件:

通过以下方式注册事件:

CeRunAppAtEvent("\\\\.\\Notifications\\NamedEvents\\WakeupEvent",
    NOTIFICATION_EVENT_WAKEUP);

启动一个新线程以等待:
Thread waitForWakeThread = new Thread(new ThreadStart(WaitForWakeup));
waitForWakeThread.Start();

然后在目标方法中执行以下操作:
private void WaitForWakeup()
{
    IntPtr handle = CreateEvent(IntPtr.Zero, 0, 0, "WakeupEvent");
    while (true)
    {
        WaitForSingleObject(handle, INFINITE);
        MessageBox.Show("Wakey wakey");
    }
}

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

有没有办法杀死WaitForSingleObject正在等待的句柄,以迫使它返回?

非常感谢。

最佳答案

请改用WaitForMultipleObject,并传递2个句柄。现有的一个,以及一个称为“exit”之类的事件的事件。在应用程序关闭期间,退出事件将触发SetEvent,并且WaitForMultipleObject将返回,您可以让它正常退出线程。

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

同样,也可以将线程设置为后台线程。这将防止它在主线程终止时阻止您的应用程序关闭。

看:

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

关于c# - 是否可以杀死 WaitForSingleObject(handle, INFINITE)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6033074/

10-10 15:58