当所有当前计划的任务完成时,将任务排队执行 - 没有对任务的引用

时间:2014-07-04 09:11:01

标签: c# multithreading task-parallel-library task

当所有当前计划的任务完成后,是否可以将新任务排队等待执行?我无法使用TaskFactory.ContinueWhenAll,因为我没有对计划任务的引用,因为它们是由子组件调度的。获取所有当前计划的任务将有所帮助,因为在这种情况下我可以使用ContinueWhenAll方法。

1 个答案:

答案 0 :(得分:3)

  

是否可以将当前所有任务排队等待执行   预定任务已经完成?

我不认为这是一种通用的方法,除非您想诉诸反思黑客(这将不可避免地将您绑定到当前的TPL实施细节)。

说,您可以实施自定义TaskScheduler并将其传递给Task.Factory.StartNewTask.ContinueWithTask.Start。您仍然无法控制其他人明确使用TaskScheduler.DefaultTaskScheduler.FromSynchronizationContext()创建的任务。

此外,可能有async方法创建的任务,如下所示:

async Task DoAsync() { await Task.Delay(1); }

创建它们时根本没有任务调度程序(TaskScheduler意义上)。您可以实现自定义同步上下文并跟踪使用SynchronizationContext.Post发布的项目。然而,并非所有这些项目都必然代表任务延续。更重要的是,您无法跟踪await task.ConfigureAwait(false)等延迟。

可能表示您需要重新设计任务工作流逻辑或与其他开发人员协调。说,您可以访问要跟踪{{1 }}。这些父任务以“一劳永逸”的方式创建一些子任务,然后完成,子任务对您无法使用。这是错误的:在完成所有子任务之前,父任务应该正常完成。至少有几种方法可以解决此问题,例如使用TaskFactory.ContinueWhenAllasync/await,前提是可以更改第三方代码。