0

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 を定義し、同じコードを実行すると、他のタスクは実行するリソースを取得できません。

私の質問は、誰かが以前にそれにぶつかったかどうか、そしてタスクスケジューラを変更して待機中のタスクのためにリソースを解放する方法を誰かが知っているかどうかです。

4

1 に答える 1

0

QueuedTaskScheduler設計どおりに動作しています。問題は、最大同時実行レベルが固定されており、デフォルトで に設定されていることEnvironment.ProcessorCountです。

このため、デフォルトを変更していないと仮定すると、4 コアのコンピューターでは最大 4 つの実行中のタスクがあります。

これを修正するには、長時間実行されるタスクを別のスケジューラ (理想的には をサポートTaskCreationOptions.LongRunningするDefaultもの) で実行するか、極端な場合には最大同時実行レベルを最大値に設定します。

var ts = new QueuedTaskScheduler(TaskScheduler.Default, int.MaxValue);
于 2012-05-14T10:13:42.377 に答える