То, что я заметил, что, если я называю Waitone в потоке STA с установленным контекстом, My Waist> Code> «Код». Массив. Mwmo_inputavailable to msgwaitformultipleobjectsex , код, вероятно, висит, потому что в очереди потока нет событий ввода (не говоря уже о том, что поток может даже не иметь очереди сообщений. Поток STA, мое ожидание не вызвано, а вместо этого CLR -броски notsuppoertedException с сообщением ожидания нескольких ручек на потоке STA не поддерживается.
Таким образом Подождите ... Методы и позвольте мне справиться с Fallout? Можно ли игнорировать флаг waitall или есть какой -то умный обходной путь, как публикация послания фиктивного потока, чтобы убедиться, что в очереди ввода есть что -то? />
Код: Выделить всё
public override Int32 Wait(IntPtr[] Handles, Boolean WaitAll, Int32 MillisecondsTimeout)
{
if (Handles == null) {
throw new ArgumentNullException(nameof(Handles));
}
Int32 Flags = MWMO_INPUTAVAILABLE;
if (WaitAll) {
Flags |= MWMO_WAITALL;
// Without next line wait called on STA thread never returns if `MWMO_WAITALL` is set
// PostThreadMessage(GetCurrentThreadId(), 0x0000, IntPtr.Zero, IntPtr.Zero);
}
QS WakeMask = ALL_INPUT();
while (true) {
Int32 Result = MsgWaitForMultipleObjectsEx(Handles.Length, Handles, MillisecondsTimeout, WakeMask, Flags);
if (Result == WAIT_FAILED) {
return WAIT_FAILED;
}
if (Result == WAIT_TIMEOUT) {
return WAIT_TIMEOUT;
}
if (Result >= WAIT_OBJECT_0 && Result < WAIT_OBJECT_0 + Handles.Length) {
return Result - WAIT_OBJECT_0;
}
if (Result == WAIT_OBJECT_0 + Handles.Length) {
MSG msg;
while (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE)) {
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
}
}
}
Может быть>
Подробнее здесь: https://stackoverflow.com/questions/796 ... itall-true
Мобильная версия