我发现了一些使用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,尽管第二个任务是睡眠时间最短的任务,应该是第一个被删除的任务。
引擎盖下发生了什么?
答案 0 :(得分:1)
Thread.Sleep在将程序暂停指定的毫秒数时非常准确。
Thread.Sleep(1000)表示任务在1000毫秒后可以执行。
但是哪个任务首先从所有可用任务执行由任务调度程序决定,它根据线程池中的线程数和许多其他因素决定任务执行的顺序。