如何在WaitHandle上等待没有消息抽取?
问题描述:
我想在.NET中调用WaitHandle.WaitOne(TimeSpan)
,但我在STA线程中,它在等待时泵送消息。由于超出此问题范围的原因,我需要等待而不抽取。我如何等待WaitHandle被发送信号而没有信息?如何在WaitHandle上等待没有消息抽取?
在某些情况下,WaitHandle.WaitOne
似乎不会泵送消息。但它有时候会有一些消息。查看这些链接以获取更多信息:
答
WaitForSingleObject的或WaitForMultipleObjects的都是非抽水等待;使用p/invoke。
[DllImport("kernel32", SetLastError=true, ExactSpelling=true)]
public static extern Int32 WaitForSingleObject(SafeWaitHandle handle, Int32 milliseconds);
-Oisin
答
显然,这是一个change introduced in Microsoft Vista:CoWaitForMultipleHandles
现在调度WM_PAINT
消息。
解决方法是使用Microsoft的应用程序兼容性工具包为您的应用程序设置DisableNewWMPAINTDispatchInOLE标志。
答
如果你在一个WPF应用程序,其中的调度程序正在运行的消息一个是泵中管理的等待,你的等待过程中禁用消息泵的简单方法是通过Dispatcher.DisableProcessing:
// The Dispose() method is called at the end of the using statement.
// Calling Dispose on the DispatcherProcessingDisabled structure,
// which is returned from the call to DisableProcessing, will
// re-enable Dispatcher processing.
using (Dispatcher.CurrentDispatcher.DisableProcessing())
{
// Do work while the dispatcher processing is disabled.
Thread.Sleep(2000);
}
我知道问题已经得到解答,但是您能否给出一个说明WaitHandle.WaitOne泵送消息的配方?我真的不明白这里发生了什么,我很好奇。 – 2009-05-25 12:48:18
wcoenen:我在我的问题中添加了一些链接,指出WaitOne有时会传递消息。 – 2009-05-25 23:01:35