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

我得到了 1 2 3,尽管任务二是睡眠时间最短的任务,应该是第一个删除的任务。

引擎盖下发生了什么?

4

1 回答 1

1

Thread.Sleep 在将程序暂停指定的毫秒数方面相当准确。

Thread.Sleep(1000) 表示该任务将在 1000 毫秒后执行。

但是从所有可用的任务中首先执行哪个任务是由任务调度器决定的,它根据线程池中的线程数和许多其他因素来决定任务的执行顺序。

于 2016-01-20T07:00:06.570 回答