任务等待任何条件

本文关键字:条件 任何 等待 任务 | 更新日期: 2023-09-27 18:34:28

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

引擎盖下发生了什么?

任务等待任何条件

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

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

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