Какие операции блокировки потоков в.NET будут обрабатывать COM-сообщения при блокировке?

При создании нового потока STA для размещения COM-компонента STA этот поток отвечает за прокачку сообщений Windows, связанных с COM. Из того, что я смог собрать, некоторые встроенные потоковые примитивы.NET, такие как lock (Monitor.Enter), сделают это за вас, ожидая, пока объект будет освобожден другим потоком. Еще один способ создания COM-сообщений.NET pump для вас, который я видел, это использование.Join().

Где я могу найти полный список встроенных потоковых примитивов с таким поведением? Ожидание на WaitHandle поддержит это? Что насчет WaitAny() или новых параллельных коллекций в.NET 4? Я не могу найти это в документации для каких-либо конкретных методов.

1 ответ

Решение

Это может быть несколько переработано из источника SSCLI20, хотя и датировано. Основной функцией CLR, которая реализует MsgWaitForMultipleHandles, является DoAppresponWait. Из того, что я вижу, он используется AutoResetEvent, ManualResetEvent и Semaphore, но не Mutex. Одна из странностей заключается в том, что WaitHandle.WaitAny в порядке из потока STA, но WaitAll() генерирует исключение. Да, это не задокументировано нигде, кроме нескольких подсказок в блоге Криса Брамма. Вы не можете предположить слишком много из того, что я нашел, проверьте это, чтобы быть уверенным.

Другие вопросы по тегам