c# - 如何链接独立的 C# 任务?

标签 c# task-parallel-library

假设我有两个创建任务对象的独立异步函数(我无法控制):

Task A();
Task B();

和其他一些非异步函数

void X();

我如何构建一个任务链来按顺序执行所有这些并允许附加进一步的延续(将在 X 之后执行)?

如果我这样做:

Task Sequential()
{
   return A()
     .ContinueWith(t => { B(); })
     .ContinueWith(t => { X(); });
}

那是行不通的,因为 B 会启动一个新的 Task 链。如果 B 需要很长时间才能完成,则 X 将首先执行(以及 Sequential 的调用者可能在返回的 Task 上继续使用的任何其他内容)。我需要 X 成为单个任务链中的最后一个元素,并以 B 任务作为其先例。

如果我这样做:

Task Sequential()
{
   return A()
     .ContinueWith(t => { B().ContinueWith(t => { X(); }); });
}

这只是部分解决了问题,因为即使 A、B 和 X 现在将按顺序执行,如果调用者执行 Sequential().ContinueWith,该延续将与 B 和 X 并行执行,而不是在 X 之后执行。

最佳答案

有什么理由不使用 await 吗?例如,

async Task Sequential()
{
    await A();
    await B();
    X();
}

关于c# - 如何链接独立的 C# 任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40943380/

相关文章:

c# - 尽管产生了意外的堆栈溢出

c# - 并行消费来自一个队列的消息

c# - 取消时的任务状态

c# - 拆分实体数据模型属性的数据注释 [必需] 属性

c# - 组合await 和ContinueWith

c# - 如果关联的 UI 被释放,C# 中的异步可等待代码会发生什么情况

c# 列出组合框中变量字符串中的所有出现情况

c# - ThreadPool 设置是全局设置还是仅针对工作项?

c# - 单击复选框时如何显示确认消息

c# - 尝试从列表接收数据时出现 System.ObjectDisposedException