TPLでCOMオブジェクトを使用することは100%可能です。デフォルトでは、TPLは標準の.NET ThreadPoolを使用しますが、TPLには拡張ポイントがthe TaskScheduler
classであり、作成したスレッドに作業をディスパッチできる独自のスケジューラを提供できます。
COMオブジェクトを使用する場合、まずCOMクラスにSTAスレッドまたはMTAスレッドが必要かどうかを知る必要があります。 MTAスレッディングの場合、COMクラスは任意のランダムスレッドから既に使用できるため、実行する必要のある特別なことはありません。残念ながら、最も古典的なCOMオブジェクトはSTAスレッディングに頼っている傾向があります。その場合は、TaskScheduler
というカスタムを使用する必要があるため、使用している.NETスレッドがinitialized as an STA compatible threadになるようにします。
TaskSchedulersは、書くのが簡単ではありませんが、スレッドの基本的な知識があれば、どちらでも書くのは難しくありません。幸いにもthe ParallelExtensions Extras libraryはすでにStaTaskScheduler
クラスを提供していますので、あなた自身で何かを書く必要はありません。 PFXチームのa great blog post hereには、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);
すぐに試してみてください...試してみてください。 – Oded