【问题标题】:How to ensure a callback will fire when all task done by TPL如何确保在 TPL 完成所有任务时触发回调
【发布时间】:2016-04-25 17:39:40
【问题描述】:

告诉我如何编写代码,结果将调用一个回调函数来通知我所有任务,如 task1、task2、task3 已完成。谢谢

【问题讨论】:

  • @Igor 你是想说我应该使用ContinueWith() 吗?基本上我想一次触发多个函数,但我需要一些回调函数,当所有函数执行完成时触发,让我知道工作完成。
  • 这正是ContinueWith 的用途。
  • 我有 3 个不同的任务实例,那么我如何将一个 ContinueWith 用于所有 3 个任务实例?

标签: c# task-parallel-library


【解决方案1】:

您可以将Task.ContinueWithTask.WhenAll 一起使用,或者您可以将Task.WaitAll 与代码一起使用,以在调用WaitAll 之后运行。

var executingTask = Task.WhenAll(task1, task2, task3).ContinueWith((antecedent) =>{/*your code*/});

更多详情请参见Task.ContinueWith documentation

// WaitAll blocks until all tasks are complete
Task.WaitAll(task1, task2, task3);
/*your code on the following lines(s) which will run after task1,task2,task3 are complete*/

【讨论】:

  • 什么是先行词?
  • @MonojitSarkar - antecedent - a thing or event that existed before or logically precedes another。您将完成的任务作为参数,表示 task1task2task3 的执行。
  • 非常抱歉,还不清楚先行词的用法。你能用另一种方式解释吗?
  • @MonojitSarkar - 你得到了代表传递给Task.WhenAll的任务完成的完成任务。查看ContinueWith 上的文档,有一个代码示例显示Task.Factory.StartNew 返回一个DateTime 数组,然后在ContinueWith 中再次访问该数组。
  • 为什么我问了两次问题就给负分?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多