c# - 如何将任务添加到 Task.WhenAll 正在等待的集合中?

标签 c# asynchronous async-await

难道不能将任务添加到 Task.WhenAll 已经在等待的列表中吗?

我想等所有任务完成,初始化后有可能创建新的任务。但是这里 Task.WhenAll 不等待稍后添加到集合中的新任务。

List<Task> tasks = new List<Task>();

var task1 = Task.Run(async () =>
    {
        Debug.WriteLine("task #1 started");
        await Task.Delay(TimeSpan.FromSeconds(20));
        Debug.WriteLine("task #1 finished");
    });

var task2 = Task.Run(async () =>
{
    Debug.WriteLine("task #2 started");
    await Task.Delay(TimeSpan.FromSeconds(30));
    Debug.WriteLine("task #2 finished");
});

var task3 = Task.Run(async () =>
{
    Debug.WriteLine("task #3 started");
    await Task.Delay(TimeSpan.FromSeconds(10));
    var inner = Task.Run(async () =>
    {
        Debug.WriteLine("inner task started");
        await Task.Delay(TimeSpan.FromSeconds(40));
        Debug.WriteLine("inner task finished");
    });

    tasks.Add(inner);

    Debug.WriteLine("task #3 finished");
});

tasks.Add(task1);
tasks.Add(task2);
tasks.Add(task3);

await Task.WhenAll(tasks);
Debug.WriteLine("All finished");

输出:

task #2 started
task #3 started
task #1 started
task #3 finished
inner task started
task #1 finished
task #2 finished
All finished
inner task finished < didn't wait for this to finish

最佳答案

这是因为tasks.Add(inner)是在await Task.WhenAll(tasks)之后执行的。要回答您的问题,首先您需要弄清楚任务#3任务内部 之间的关系。 IMO 内部任务应该是任务#3 的一部分。也就是说,在内部任务完成之前,任务 #3 无法完成。

await inner;   //instead of tasks.Add(inner);   

关于c# - 如何将任务添加到 Task.WhenAll 正在等待的集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41671492/

相关文章:

reactjs - React - 在 DOM 渲染时显示加载屏幕?

javascript - 为什么 async/await 变量返回未定义?

c# - 如何在 Windows 窗体设计器中保存用户控件的结构属性?

c# - 在 Windows Phone 7 上从独立存储打开 JPEG 时出现问题

python - 如何正确使用 asyncio run_coroutine_threadsafe 函数?

c# - 异步私有(private)和私有(private)异步有什么区别?

javascript - 为什么我的异步函数返回得太快?

c# - 套接字错误 10054 : Error Handling Issue

c# - 更新 wpf 中的 UI 元素

mongodb - Redis vs MongoDB 存储异步结果过期