ParallelExetensionExtrasに同梱されているQueuedTaskSchedulerに問題がありますが、私の質問は待機中のタスク、タスクスケジューラ、およびスレッドリソースについてかなり一般的です。TPLのタスクを待機し、QueuedTaskScheduler(ParallelExtensionsExtra)の問題を解決する
待ちタスクがリソースを消費するように見えます。この例では、デフォルトのタスクスケジューラを使用しています。この例では、長時間実行されるタスクが1つあり、完了を待つタスクがいくつかあります以下の実行を保留中です。
すべてがうまくいきます。待機中のタスクが作業を開始し、待機時間中にリソースを解放して他のタスクも実行を開始することがわかります。
var taskScheduler = TaskScheduler.Default;//ts.ActivateNewQueue(0);
var longRunningTask = Task.Factory.StartNew(() => Thread.Sleep(Int32.MaxValue), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() =>
{
Console.WriteLine("Hi from waiting task");
longRunningTask.Wait();
}, CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() =>
{
Console.WriteLine("Hi from waiting task");
longRunningTask.Wait();
}, CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() =>
{
Console.WriteLine("Hi from waiting task");
longRunningTask.Wait();
}, CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() => Console.WriteLine("Hi"), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() => Console.WriteLine("Hi"), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() => Console.WriteLine("Hi"), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() => Console.WriteLine("Hi"), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() => Console.WriteLine("Hi"), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() => Console.WriteLine("Hi"), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
Task.Factory.StartNew(() => Console.WriteLine("Hi"), CancellationToken.None, TaskCreationOptions.None, taskScheduler);
私はこれを行うには、最初の2行に変更した場合:
var ts = new QueuedTaskScheduler();
var taskScheduler = ts.ActivateNewQueue(0);
意味を、他のタスクを実行するためのリソースを取得していないだけで決して、1つのキューでQueuedTaskSchedulerを定義し、同じコードを実行します。
私の質問は、以前に誰かが突っ込んできた場合、誰かがタスクスケジューラを変更して待機中のタスク用のリソースを解放する方法を知っているかどうかです。
なぜこれらのタスクが最初の「タスク」を待っているのですか? – svick