如何在WaitHandle上等待没有消息抽取?

问题描述:

我想在.NET中调用WaitHandle.WaitOne(TimeSpan),但我在STA线程中,它在等待时泵送消息。由于超出此问题范围的原因,我需要等待而不抽取。我如何等待WaitHandle被发送信号而没有信息?如何在WaitHandle上等待没有消息抽取?

在某些情况下,WaitHandle.WaitOne似乎不会泵送消息。但它有时候会有一些消息。查看这些链接以获取更多信息:

  1. Managed and Unmanaged Threading in Microsoft Windows
  2. Managed blocking
+0

我知道问题已经得到解答,但是您能否给出一个说明WaitHandle.WaitOne泵送消息的配方?我真的不明白这里发生了什么,我很好奇。 – 2009-05-25 12:48:18

+0

wcoenen:我在我的问题中添加了一些链接,指出WaitOne有时会传递消息。 – 2009-05-25 23:01:35

WaitForSingleObject的或WaitForMultipleObjects的都是非抽水等待;使用p/invoke。

[DllImport("kernel32", SetLastError=true, ExactSpelling=true)] 
public static extern Int32 WaitForSingleObject(SafeWaitHandle handle, Int32 milliseconds); 

-Oisin

显然,这是一个change introduced in Microsoft VistaCoWaitForMultipleHandles现在调度WM_PAINT消息。

Vista bug report

解决方法是使用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); 
}