任务WaitAny条件

时间:2013-10-08 12:14:50

标签: c# task-parallel-library

我发现了一些使用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,尽管第二个任务是睡眠时间最短的任务,应该是第一个被删除的任务。

引擎盖下发生了什么?

1 个答案:

答案 0 :(得分:1)

Thread.Sleep在将程序暂停指定的毫秒数时非常准确。

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

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