私は現在、ここで詳しく説明されているLimitedConcurrencyLevelTaskSchedulerを使用しています。http://msdn.microsoft.com/en-us/library/ee789351.aspx
これを拡張して、個々のタスクに優先順位を割り当てられるようにしたいと考えています。これらの優先順位は、スレッドの優先順位にマップする必要はありません。タスクが開始される順序にのみ影響する必要があります。
このようなタスク スケジューラの例を知っている人はいますか? (スケジュール関連の多くのことは私には理解できないので、既存のソリューションがあれば素晴らしいと思います)
ベストアンサー1
のParallel Extensions の追加サンプル。すでにそのようなスケジューラである QueuedTaskScheduler を提供しています。このスケジューラは、優先順位、同時実行制限、公平性、および使用されるスレッドのタイプと優先順位のきめ細かい制御を提供します。もちろん、必要のない機能を使用したり構成したりする必要はありません。
Stephen Toubは、Parallel Extensions Extrasのさまざまなスケジューラについて簡単に説明しています。ここ
QueuedTaskScheduler を使用するには、必要な優先度を指定して ActivateNewQueue メソッドを呼び出します。このメソッドは、親 TaskScheduler によって管理される新しい TaskScheduler 派生の Queue オブジェクトを返します。特定のキューを使用するすべてのタスクは、親 TaskScheduler によって優先度に従ってスケジュールされます。
次のコードは、最大同時実行レベルが 4、優先度キューが 2 つのスケジューラを作成し、最初のキューにタスクをスケジュールします。
QueuedTaskScheduler qts = new QueuedTaskScheduler(TaskScheduler.Default,4);
TaskScheduler pri0 = qts.ActivateNewQueue(priority: 0);
TaskScheduler pri1 = qts.ActivateNewQueue(priority: 1);
Task.Factory.StartNew(()=>{ },
CancellationToken.None,
TaskCreationOptions.None,
pri0);