c# - 多个任务完成后如何调用一个任务

标签 c# task-parallel-library task

我有列表任务,这些任务做一些不相关的工作。我需要的是显示消息框,以防所有任务都正确完成工作。我尝试了几种方法,但对我来说没有任何效果。最简单的方法是使用

Task continuation = Tasks.WhenAll(tasks);
continuation.ContinueWith(obj => {
    show messagebox
});

但 ContinueWith 仍会为所有任务运行,而不仅仅是继续任务。我尝试设置取消标记或使用符号,但任务同时运行,所以它不起作用。

如有任何帮助,我将不胜感激。

最佳答案

ContinueWith still runs for all tasks, not just for continuation task.

这是不正确的。 ContinueWith 将在所有任务执行完毕后运行一次。你可以很容易地模拟这个:

var tasks = new[] { Task.Delay(1000), Task.Delay(2000), Task.Delay(500) };
Task.WhenAll(tasks).ContinueWith(x => Console.WriteLine("Finished"));
Console.Read();

您只会看到“Finished”打印一次。

如果可以的话,我当然更愿意使用 await 而不是附加一个延续:

public async Task FooAsync()
{
    var tasks = new[] { Task.Delay(1000), Task.Delay(2000), Task.Delay(500) };
    await Task.WhenAll(tasks);
    Console.WriteLine("Done").
}

关于c# - 多个任务完成后如何调用一个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33347177/

相关文章:

c# - 如何使两个SQL查询真正异步

java - 让任务在用户取消之前完成

f# - 我什么时候应该使用 Async.AwaitIAsyncResult 而不是 Async.AwaitTask 来等待任务?

c# - 对已实例化的对象使用 using 语句

c# - 在 IAuthorizationPolicy 中获取服务实例

c# - 访问和更改结构作为属性与作为字段

c# - 为什么我们需要指针来为 Go/C 中的变量赋值而不是 C#/Java

c# - 在 C# 中,顺序循环如何比并行循环运行得更快?

c# - 任务似乎自动开始

c# - 如果至少有一个任务结束,如何关闭所有任务