Jest w 100% możliwe korzystanie z obiektów COM z licencją OC. Chociaż prawdą jest, że domyślnie TPL korzysta ze standardowego .NET ThreadPool, TPL ma punkt rozszerzenia za pośrednictwem the TaskScheduler
class, który umożliwia ci dostarczenie własnego harmonogramu, który może wysłać pracę do wątków, które stworzyłeś.
W przypadku korzystania z obiektów COM najpierw trzeba wiedzieć, czy klasa COM wymaga gwintowania STA lub gwintowania MTA. Jeśli chodzi o wątki MTA, to nie ma nic szczególnego, co trzeba zrobić, ponieważ klasa COM może już być używana z dowolnego losowego wątku. Niestety, większość klasycznych obiektów COM zwykle opiera się na wątkach STA i wtedy trzeba użyć niestandardowego TaskScheduler
, aby każdy wątek .NET, z którego je używasz, był initialized as an STA compatible thread.
Podczas gdy TaskSchedulers nie są dość proste do napisania, nie są tak trudne do napisania, jeśli masz podstawową wiedzę na temat wątków. Na szczęście the ParallelExtensions Extras library zapewnia już klasę StaTaskScheduler
, więc nie musisz nawet pisać nic samemu. Zespół PFX omawia implementację i niektóre przypadki użycia dla klasy StaTaskScheduler
, która jest a great blog post here.
Zasadniczo, należy zainicjować nowy StaTaskScheduler
jako statyczny w dowolnym miejscu na jednej z klas, a następnie po prostu rozpocząć Tasks
określając, że są one zaplanowane przez tę instancję. To wyglądałoby mniej więcej tak:
// 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);
Brzmi jak idealny kandydat do szybkiego testu ... spróbuj. – Oded