Как ждать на WaitHandle без прокачки сообщений? - PullRequest
10 голосов
/ 22 мая 2009

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

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

  1. Управляемые и неуправляемые потоки в Microsoft Windows
  2. Управляемая блокировка

Ответы [ 3 ]

8 голосов
/ 22 мая 2009

WaitForSingleObject или WaitForMultipleObjects не ожидают перекачки; используйте p / invoke.

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

-Oisin

3 голосов
/ 11 августа 2012

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

Отчет об ошибках в Vista .

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

1 голос
/ 23 августа 2012

Если вы находитесь в приложении WPF, в котором Dispatcher - это приложение, запускающее насосы сообщений во время управляемого ожидания, самый простой способ отключить насос сообщений во время ожидания - через 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...