ParallelExtensionsExtrasのQueuedTaskSchedulerを使用して、タスクT、AおよびBをスケジュールしています。QueuedTaskSchedulerはスレッドを1つだけ使用するように設定されています。タスクAとBは2000ミリ秒間だけスリープします。タスクTはAとBを開始します。QueuedTaskSchedulerを使用してネストされたタスクを優先順位付けする方法は?
私はq1(優先度1)とq2(優先度2)の2つのキューを使用しています。私の理解から、これは、q1でスケジュールされたタスクがq2でスケジュールされたタスクより優先されることを意味します。タスクTとAはq1で開始され、タスクBはq2で開始されます。 AとBを開始した後、Tはそれらが終了するのを待ちます。
最初にAが始まり、次にBが、AとBがTask.WaitAll関数に渡される順序によって順序が完全に決まると思います。
AからBをネストされたタスク(Tから)として開始しないと、その順序は期待通りです。
ネストしたタスクを開始するときにQueuedTaskSchedulerが期待通りに機能しないのはなぜですか?
void Main()
{
var qts = new QueuedTaskScheduler(TaskScheduler.Default, 1);
var scheduler1 = qts.ActivateNewQueue(1);
var scheduler2 = qts.ActivateNewQueue(2);
Task T = new Task(() =>
{
var B = slowTask(scheduler2, "B");
var A = slowTask(scheduler1, "A");
Task.WaitAll(A, B);
});
T.Start(scheduler1);
Task.WaitAll(T);
}
private Task slowTask(TaskScheduler scheduler, string name)
{
var t = new Task(() =>
{
Console.WriteLine($"starting {name}");
Thread.Sleep(2000);
}, CancellationToken.None, TaskCreationOptions.None);
t.Start(scheduler);
return t;
}