5

Task.WaitAny 条件を使用するコードを見つけました。

Task<int>[] tasks = new Task<int>[3];

tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; });
tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; });
tasks[2] = Task.Run(() => { Thread.Sleep(3000); return 3; });

while (tasks.Length > 0) {
    int i = Task.WaitAny(tasks);
    Task<int> completedTask = tasks[i];

    Console.WriteLine(completedTask.Result);

    var temp = tasks.ToList();
    temp.RemoveAt(i);
    tasks = temp.ToArray();
}

コードは正常に動作し、結果は 2 1 3 です。

睡眠間隔を変えてみたら

tasks[0] = Task.Run(() => { Thread.Sleep(2000); return 1; });
tasks[1] = Task.Run(() => { Thread.Sleep(1000); return 2; });
tasks[2] = Task.Run(() => { Thread.Sleep(1000); return 3; });

while (tasks.Length > 0) {
    int i = Task.WaitAny(tasks);
    Task<int> completedTask = tasks[i];

    Console.WriteLine(completedTask.Result);

    var temp = tasks.ToList();
    temp.RemoveAt(i);
    tasks = temp.ToArray();
}

タスク番号 2 は睡眠時間が最も短いタスクであり、最初に削除する必要があるにもかかわらず、1 2 3 を得ました。

ボンネットの下で何が起こっているのですか?

4

1 に答える 1

1

Thread.Sleep は、指定されたミリ秒数だけプログラムを一時停止するという点でかなり正確です。

Thread.Sleep(1000) は、タスクが 1000 ミリ秒後に実行可能になることを意味します。

しかし、利用可能なすべてのタスクからどのタスクを最初に実行するかは、タスク スケジューラによって決定されます。タスク スケジューラは、スレッド プール内のスレッドの数と他の多くの要因に基づいて、タスクの実行順序を決定します。

于 2016-01-20T07:00:06.570 に答える