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

标签 c# multithreading task-parallel-library task

当所有当前计划的任务都完成后,是否可以将新任务排队等待执行?我不能使用 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.StartNewTask.ContinueWithTask .开始。您仍然无法控制其他人创建的任务,这些任务明确使用 TaskScheduler.DefaultTaskScheduler.FromSynchronizationContext()

此外,可能还有一些任务是由 async 方法创建的,如下所示:

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

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

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

关于c# - 当所有当前计划的任务完成时,将任务排队执行 - 没有对任务的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24570683/

相关文章:

multithreading - Spring相当于CompletionService?

c - 多线程独占访问文件

c# - 我如何在 C# 中编写一个方法,一旦条件为真就返回?

c# - 如何判断三角形的三个顶点是循环顺序还是反循环顺序?

c# - 单元测试属性持续时间格式

c# - 使用 Graph Api 针对租户进行角色计数

c# - 基于任务的编程在 ASP.Net 页面或异步页面中是否可接受是首选方法

c# - 如何将.net程序集标记为安全?

multithreading - 如何在基于 servlet 的 Web 应用程序中运行后台任务?

c# - 如何暂停任务执行