È possibile utilizzare al 100% gli oggetti COM con TPL. Mentre è vero che, per impostazione predefinita, il TPL utilizzerà lo standard .NET ThreadPool, il TPL ha un punto di estensione tramite the TaskScheduler
class che consente di fornire il proprio programma di pianificazione che può inviare lavoro ai thread che hai creato.
In caso di utilizzo di oggetti COM è necessario innanzitutto sapere se la classe COM richiede il threading STA o il threading MTA. Se il threading MTA, quindi non c'è nulla di speciale che deve essere fatto perché la classe COM può già essere utilizzata da qualsiasi thread casuale. Sfortunatamente la maggior parte degli oggetti COM classici tendono a fare affidamento sul threading STA e in quel caso è necessario utilizzare un valore personalizzato TaskScheduler
in modo che qualsiasi thread .NET dal quale li si sta utilizzando sia stato initialized as an STA compatible thread.
Mentre TaskSchedulers non sono esattamente banali da scrivere, non sono poi così difficili da scrivere se hai una conoscenza di base del threading. Fortunatamente lo the ParallelExtensions Extras library fornisce già una classe StaTaskScheduler
in modo da non dover nemmeno scrivere nulla da soli. C'è il a great blog post here dal team PFX che discute l'implementazione di e alcuni casi d'uso per la classe StaTaskScheduler
.
In linea di principio, è preferibile inizializzare un nuovo StaTaskScheduler
come statico da qualche parte in una delle classi e quindi avviare semplicemente il proprio Tasks
specificando che sono stati programmati da tale istanza. Sarebbe come:
// 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);
fonte
2011-02-12 17:31:56
Sembra un candidato perfetto per un test rapido ... provalo. – Oded