ParallelExetensionExtras に同梱されている QueuedTaskScheduler で気がかりな問題に直面していますが、私の質問は待機中のタスク、タスク スケジューラ、およびスレッド リソースに関する一般的なものです。
待機中のタスクがリソースを消費しているようです。まず、デフォルトのタスク スケジューラを使用するこの例を確認してください。この例では、長時間実行される 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 を定義し、同じコードを実行すると、他のタスクは実行するリソースを取得できません。
私の質問は、誰かが以前にそれにぶつかったかどうか、そしてタスクスケジューラを変更して待機中のタスクのためにリソースを解放する方法を誰かが知っているかどうかです。