当所有当前计划的任务完成后,是否可以将新任务排队等待执行?我无法使用TaskFactory.ContinueWhenAll,因为我没有对计划任务的引用,因为它们是由子组件调度的。获取所有当前计划的任务将有所帮助,因为在这种情况下我可以使用ContinueWhenAll方法。
答案 0 :(得分:3)
是否可以将当前所有任务排队等待执行 预定任务已经完成?
我不认为这是一种通用的方法,除非您想诉诸反思黑客(这将不可避免地将您绑定到当前的TPL实施细节)。
说,您可以实施自定义TaskScheduler
并将其传递给Task.Factory.StartNew
,Task.ContinueWith
或Task.Start
。您仍然无法控制其他人明确使用TaskScheduler.Default
或TaskScheduler.FromSynchronizationContext()
创建的任务。
此外,可能有async
方法创建的任务,如下所示:
async Task DoAsync() { await Task.Delay(1); }
创建它们时根本没有任务调度程序(TaskScheduler
意义上)。您可以实现自定义同步上下文并跟踪使用SynchronizationContext.Post
发布的项目。然而,并非所有这些项目都必然代表任务延续。更重要的是,您无法跟踪await task.ConfigureAwait(false)
等延迟。
可能表示您需要重新设计任务工作流逻辑或与其他开发人员协调。说,您可以访问要跟踪{{1 }}。这些父任务以“一劳永逸”的方式创建一些子任务,然后完成,子任务对您无法使用。这是错误的:在完成所有子任务之前,父任务应该不正常完成。至少有几种方法可以解决此问题,例如使用TaskFactory.ContinueWhenAll
或async/await
,前提是可以更改第三方代码。