c# - 当当前任务阻塞时,如何在 .NET 中安排另一项任务?

标签 c# .net-4.0 concurrency task-parallel-library

对于我的 .NET 4.0 项目,我使用并发度有限的自定义 TaskScheduler(类似于 MSDN 上的 LimitedConcurrencyLevelTaskScheduler 示例)。它执行的一堆任务会阻塞,同时等待其他操作返回结果,然后继续工作。因为遗憾的是这个调度程序的线程在这段时间没有任何事情可做,所以我想在一个任务阻塞时调度另一个任务。

我认为也许 TPL 可以看到任务何时阻塞,然后安排其他任务,但我对 Monitor.Wait() 或等待 ManualResetEvent 的实验有事实证明情况并非如此。由于我已经在使用自己的任务调度程序,我认为可能有办法明确告诉它安排另一个任务,但我没有在 TaskTaskScheduler 上找到任何方法等等来这样做。

请注意,延续在这里不起作用,因为我正在执行一项任务。另外,我真的很想避免将任务分成两个,即预等待任务和后等待任务,因为可能有几个点需要等待,将它们全部拆分会导致我的原始算法出现一定程度的碎片化这将使其难以维护。我认为异步 CTP 中的 await 之类的东西会很有帮助,但我必须坚持使用 .NET 4。

我是否缺少一些东西来告诉任务调度程序将下一个任务出队,然后在该任务完成后返回到当前任务?

最佳答案

如果您有自己的 TaskScheduler,TPL 不会安排任何事情,这是 TaskScheduler 的工作。

如果您想通过某种方式告诉自定义 TaskScheduler 安排另一个 Task,您必须自行将其添加到您的 TaskScheduler 。而且您无法执行新的 Task 然后“返回”旧任务,因为无法暂停正在执行的 Task

但最简单的解决方案可能是使用默认的 TaskScheduler,因为它在决定要执行多少个 Task 时会考虑阻塞的 Task时间表。

关于c# - 当当前任务阻塞时,如何在 .NET 中安排另一项任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852801/

相关文章:

c# - 克隆编码但关闭 BOM

c# - 删除 C# 中重复的、硬编码的循环和条件

c# - IStructuralEquatable 与等于?

c# - 在 Linq 语句中使用 ConcurrentQueue

concurrency - 如何将对象更新/插入到 Mongodb 的内部列表中?

wcf - WCF 中的同时调用处理

c# - 从 Umbraco 获取 JSON 数据

.net - Windows 服务在从 3.5 迁移的 Windows Server 2008、x64、.NET 4 上引发 System.BadImageFormatException

concurrency - 消息传递和共享内存并发模型有什么区别?

c# - 输出缓存不起作用