当所有当前计划的任务都完成后,是否可以将新任务排队等待执行?我不能使用 TaskFactory.ContinueWhenAll因为我没有对计划任务的引用,因为它们是由子组件计划的。获取所有当前计划的任务会有所帮助,因为在这种情况下我可以使用 ContinueWhenAll 方法来使用它们。
最佳答案
Is it possible to queue a new task for execution when all currently scheduled tasks have finished?
我认为没有通用的方法来执行此操作,除非您想求助于反射 hack(这将不可避免地将您绑定(bind)到当前的 TPL 实现细节)。
例如,您可以实现自定义 TaskScheduler
并将其传递给 Task.Factory.StartNew
、Task.ContinueWith
或 Task .开始
。您仍然无法控制其他人创建的任务,这些任务明确使用 TaskScheduler.Default
或 TaskScheduler.FromSynchronizationContext()
。
此外,可能还有一些任务是由 async
方法创建的,如下所示:
async Task DoAsync() { await Task.Delay(1); }
它们是在没有任务调度器的情况下创建的(在 TaskScheduler
意义上)。您可以实现自定义同步上下文并跟踪使用 SynchronizationContext.Post
发布的项目。然而,并非所有这些项目都必然代表任务延续。此外,您将无法跟踪 await task.ConfigureAwait(false)
之类的延续。
这可能是您需要重新设计任务工作流逻辑或与其他开发人员协调的标志。比如说,您可以访问一些您想使用 跟踪的根父任务TaskFactory.ContinueWhenAll
。这些父任务以即发即弃的方式创建一些子任务,然后完成,您无法使用这些子任务。这是错误的:在所有子任务完成之前,父任务通常不会完成。至少有几种方法可以解决此问题,例如使用 async/await
或 Task.Unwrap
,前提是可以更改第 3 方代码。
关于c# - 当所有当前计划的任务完成时,将任务排队执行 - 没有对任务的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24570683/