Как ждать на 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);
}