На 100% возможно использование COM-объектов с TPL.Хотя это правда, что по умолчанию TPL будет использовать стандартный .NET ThreadPool, TPL имеет точку расширения через TaskScheduler
класс , который позволяет вам предоставить свой собственный планировщик, который может передавать работу потокамкоторую вы создали.
В случае использования COM-объектов вам сначала необходимо узнать, требует ли COM-класс потоков STA или MTA.В случае MTA-потоков ничего особенного делать не нужно, поскольку класс COM уже можно использовать из любого случайного потока.К сожалению, большинство классических COM-объектов, как правило, полагаются на многопоточность STA, и именно тогда вам потребуется использовать пользовательский TaskScheduler
, чтобы любой поток .NET, из которого вы их используете, был инициализирован как STA-совместимый поток .
Хотя TaskSchedulers не совсем тривиальны для написания, их не так сложно написать, если у вас есть базовое понимание потоков.К счастью библиотека ParallelExtensions Extras уже предоставляет класс StaTaskScheduler
, поэтому вам даже не нужно ничего писать самостоятельно. отличный пост в блоге от команды PFX, в котором обсуждается реализация и некоторые варианты использования для класса StaTaskScheduler
.
По сути, вы захотите инициализировать новыйStaTaskScheduler
как статическое где-то на одном из ваших классов, а затем просто запустите Tasks
, указав, что они запланированы этим экземпляром.Это будет выглядеть примерно так:
// Create a static instance of the scheduler specifying some max number of threads
private static readonly StaTaskScheduler MyStaTaskScheduler = new StaTaskScheduler(4);
....
// Then specify the scheduler when starting tasks that need STA threading
Task.TaskFactory.StartNew(
() =>
{
MyComObject myComObject = new MyComObject();
myComObject.DoSomething();
// ... etc ...
},
CancellationToken.None,
TaskCreationOptions.None,
MyStaTaskScheduler);