0

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; 
} 

答えて

0

私はTask.WaitAllの実装をチェックしました。まだ起動していないタスクに対しては、独自のスレッド(インライン)を使用します。私はBがAの前に開始されていたのですが、優先順位の高いタスクが常に最初に開始されるようにするには、Task.WaitAllに渡されるタスク配列をソートします低い優先順位から高い優先順位へ

利用可能なスレッドの数が1より大きい場合、インライン化されていないタスクは、優先順位に従って予定された順序でスケジュールされることに注意してください。

関連する問題