Как ждать на WaitHandle без перекачки сообщений?

Я хочу называть WaitHandle.WaitOne(TimeSpan) в .NET, но я нахожусь в потоке STA, и он нажимает сообщения во время ожидания. По причинам, выходящим за рамки этого вопроса, мне нужно подождать без перекачки. Как я могу ждать сообщения WaitHandle без пересылки сообщений?

В некоторых случаях кажется, что WaitHandle.WaitOne не передает сообщения. Но иногда это происходит для некоторых сообщений. Для получения дополнительной информации см. Эти ссылки:

Ответ 1

WaitForSingleObject или WaitForMultipleObjects не являются откачками; используйте p/invoke.

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

-Oisin

Ответ 2

По-видимому, это было изменение появившееся в Microsoft Vista: CoWaitForMultipleHandles теперь отправляет сообщения WM_PAINT.

Отчет об ошибке Vista.

Обходной путь заключается в использовании инструментария совместимости приложений Microsoft для установки флажка DisableNewWMPAINTDispatchInOLE для вашего приложения.

Ответ 3

Если вы находитесь в приложении 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);
}