Я знаю, что требование COM, что каждый поток вызывает CoInitialize
, прежде чем взаимодействовать с системой COM.
.NET предоставляет некоторые элементы, которые внутренне работают с потоками, например:
-
ThreadPool
темы - асихронные делегаты (которые используют потоки пула потоков)
-
BackgroundWorker
class (которые используют асинхронные делегаты (которые используют потоки пула потоков)) - сборщик мусора
- и многое другое! (то есть, например).
Если я собираюсь взаимодействовать с COM-объектом из потока, мне нужно сначала вызвать CoInitialize
?
Я прошу, потому что может быть какая-то больше магии, которая автоматически вызывает это для меня - я не знаю.
Чтение бонусов
Управляемые и неуправляемые потоки
Взаимодействие, общая среда выполнения языка создает и инициализирует квартиру при вызове COM-объекта. Управляемая нить может создавать и вводить однопоточную квартиру (STA), которая содержит только один поток или многопоточная квартира (MTA), которая содержит один или больше потоков. Когда COM-квартира и потолочная квартира совместимы, COM позволяет вызывающему потоку совершать вызовы напрямую к COM-объекту. Если квартиры несовместимы, COM создает совместимые квартиры и маршалы все звонки через прокси в новом квартира.
Время выполнения вызывает CoInitializeEx для инициализации COM-квартиры как либо MTA, либо квартира STA.
Обновить два:
Похоже, вы не должны использовать COM из любого потока, который может предоставить .NET:
Пул управляемых потоков
Существует несколько сценариев, в которых управляйте своими потоками вместо потоков потоков потоков:
Вам нужна передняя часть.
Для потока требуется определенный приоритет.
У вас есть задачи, которые заставляют поток блокировать длительные периоды время. Пул потоков имеет максимальное количество потоков, поэтому большой количество заблокированных потоков пула потоков может препятствовать выполнению задач из начиная.
Вам нужно разместить потоки в однопоточной квартире. Все Нити ThreadPool находятся в многопоточной квартире.
Вам нужно иметь устойчивое удостоверение, связанное с потоком, или посвятить поток заданию.
Обновить три:
Похоже, что вы можете установить модель потоков неименных потоков:
Управляемые и неуправляемые потоки в Microsoft Windows
Управляемый поток может быть помечен, чтобы указать, что он будет размещать однопоточную или многопоточную квартиру. GetApartmentState, SetApartmentState и TrySetApartmentState метода Thread возвратить класс и присвоить его состояние. Если состояние не установлено, GetApartmentState возвращает ApartmentState.Unknown.
Свойство может быть установлено только тогда, когда поток находится в состоянии ThreadState.Unstarted; он может быть установлен только один раз для потока.
Если состояние квартиры не установлено до начала потока, поток инициализируется как многопоточная квартира (MTA).
Много противоречивой информации.
Вот почему мы будем использовать то, что сказал парень из Stackoverflow как истинный ответ.