SynchronizationContext.Wait переопределить и waitall = trueC#

Место общения программистов C#
Ответить
Anonymous
 SynchronizationContext.Wait переопределить и waitall = true

Сообщение Anonymous »

Итак, я попытался написать переопределение для этого при создании своего собственного планировщика потоков STA, чтобы я мог продолжать накачать сообщения, вызывая msgwaitformultipleobjectsex .
То, что я заметил, что, если я называю 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);
}
}
}
}
Чтобы воспроизвести «Создать поток», установить модель квартиры на STA, назначить SynchronizationContext с переопределением ожидания, а затем вызовите Waitone на AutoresetEvent Inside STA поток и вызовы в основной теме после задержки. Поток STA заблокируется в переопределении ожидания, потому что он будет вызван внутренне с помощью waitall = true из метода Waitone .
Может быть>

Подробнее здесь: https://stackoverflow.com/questions/796 ... itall-true
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»