同時実行と調整実行時

2899 ワード

テキストリンク
マイクロソフトは最近、ロボット用にアプリケーションを作成する新しいMicrosoft Robotics Studioのプレビュー版を発表した.これらの新しいツールは面白いですが、ロボットのプログラミングだけよりも面白いはずです.
 

Dispatcherクラス


アプリケーションを初期化するときは、まずDispatcherオブジェクトを構築してスレッドのセットを管理したいと思っています.実際にはスレッドプールです.CLRのスレッドプールと同様に、これらのスレッド呼び出しメソッドは(delegateによって)タスクを実行します.
public sealed class Dispatcher : IDisposable {

    public Dispatcher();

    public Dispatcher(Int32 threadCount, String threadPoolName);

    public Dispatcher(Int32 threadCount, ThreadPriority priority,

        String threadPoolName);

    public ICollection<DispatcherQueue> DispatcherQueues { get; }

    ... // Other members not shown

}

Dispatcherオブジェクトを作成すると、コンストラクション関数に希望するスレッド数を渡すことができます.デフォルトでは、DispatcherはCPUごとにスレッドを作成します.Dipatcherオブジェクトが作成するスレッドの数は固定されており、Dispatcherにはスレッドを動的に作成または破棄する論理はありません.CLRスレッドプールとは異なり、ワークロードを定期的にチェックし、スレッドプール内のスレッド数を動的に調整するための特別なスレッドはありません.これにより、Dispatcherスレッドプールの論理が簡略化され、より効率的になります.
Dispatcherを構築する場合は、スレッドスケジューリングの優先度を設定することもできます.デフォルトでは、スレッドの優先度は通常です.また、Dispatcherが作成したスレッドの名前を設定することもできます.Dispatcherの内部にスレッドが作成されると、スレッドオブジェクトのName属性が設定した名前に割り当てられます.この名前は、Visual Studioでデバッグしたときにスレッドウィンドウで表示されるデバッグに役立ちます.
CLRのグローバル唯一のスレッドプールとは異なり、CCRでは複数のDispatcherオブジェクトを作成することで複数のスレッドプールを作成できます.これにより、異なるタイプのタスクに対して異なるスレッドプールを作成できます.必要に応じて、スレッドプールごとに異なる優先度を設定することもできます.

DispatcherQueueクラス


Dispatcherを作成すると、DispatcherQueueオブジェクトを作成します.DispatcherQueueは、実行の準備をしているdelegateのキューを維持します.Dispatcherのスレッドは、DispatcherQueueに要素が表示されるのを待っています.通常、DispatcherQueueは空であり、Dispatcherのスレッドは待機中である.要素が現れると、Dispatcherスレッドが蘇り、その要素に対応する方法が実行されます.
public sealed class DispatcherQueue : IDisposable {

    // Use CLR thread pool; not Dispatcher

    public DispatcherQueue(string name); 

    public DispatcherQueue(String name, Dispatcher dispatcher);



    public virtual void Enqueue(ITask task);

    public virtual void EnqueueTimer(

        TimeSpan timeSpan, Port<DateTime> timerPort);

   

    public void Dispose();



    ... // Other members not shown

}

CLRのスレッドプールでは、1000個の要素が並んでいる場合、この1000個の要素が処理されるまで新しい要素を処理することはできません.ただし、CCRでは、ほとんどの作業項目にDispatcherQueueを割り当て、優先度の高い作業項目に別のDispatcherQueueオブジェクトを割り当てることができます.Dispatcherオブジェクトは、それに関連付けられたすべてのDispatcherQueueにループし、要素を取り出します.また、DispatcherQueueのコンストラクション関数にDispatcherパラメータが含まれていない場合、DispatcherではなくCLRスレッドプールを使用するDispatcherQueueオブジェクトが作成される可能性があることを指摘する必要があります.
通常、アプリケーションは初期化時にDispatcherオブジェクトとDispatcherQueueオブジェクトを構築し、プログラムの残りのライフサイクルで使用します.したがって、アプリケーションが常に構築され、しばらく使用されてから廃棄されるオブジェクトに注目します.

PortとArbiterクラス


汎用のPortオブジェクトはキューを表し、キュー内のすべての要素タイプはTです.portはコールバック関数のパラメータキューであり、ThreadPoolに似ていると考えられます.QueueUserWorkItemメソッドのstateパラメータ.
非同期操作が完了すると、その結果はPortオブジェクトに送信されます.