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

本文关键字:任务 执行 引用 等待 计划 完成时 排队 | 更新日期: 2023-09-27 18:11:20

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

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

是否有可能将一个新任务排在队列中等待执行,而当前所有任务计划任务是否已完成?

我不认为有一个通用的方法来做到这一点,除非你想求助于反射技巧(这将不可避免地将你绑定到当前的TPL实现细节)。

例如,您可以实现自定义TaskScheduler并将其传递给Task.Factory.StartNew, Task.ContinueWithTask.Start。您仍然无法控制其他人创建的任务,这些任务显式使用TaskScheduler.DefaultTaskScheduler.FromSynchronizationContext()

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

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

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

这可能是您需要重新设计任务工作流逻辑或与其他开发人员协调的信号。说,你有访问一些根父任务,你想用TaskFactory.ContinueWhenAll跟踪。这些父任务以"即发即忘"的方式创建一些子任务,然后完成,并且子任务对您不可用。这是错误的:父任务在所有子任务完成之前通常不应该完成。至少有几种方法可以解决这个问题,比如使用async/awaitTask.Unwrap,前提是第三方代码可以更改。