对于我的 .NET 4.0 项目,我使用并发度有限的自定义 TaskScheduler
(类似于 MSDN 上的 LimitedConcurrencyLevelTaskScheduler 示例)。它执行的一堆任务会阻塞,同时等待其他操作返回结果,然后继续工作。因为遗憾的是这个调度程序的线程在这段时间没有任何事情可做,所以我想在一个任务阻塞时调度另一个任务。
我认为也许 TPL 可以看到任务何时阻塞,然后安排其他任务,但我对 Monitor.Wait()
或等待 ManualResetEvent
的实验有事实证明情况并非如此。由于我已经在使用自己的任务调度程序,我认为可能有办法明确告诉它安排另一个任务,但我没有在 Task
、TaskScheduler
上找到任何方法等等来这样做。
请注意,延续在这里不起作用,因为我正在执行一项任务。另外,我真的很想避免将任务分成两个,即预等待任务和后等待任务,因为可能有几个点需要等待,将它们全部拆分会导致我的原始算法出现一定程度的碎片化这将使其难以维护。我认为异步 CTP 中的 await
之类的东西会很有帮助,但我必须坚持使用 .NET 4。
我是否缺少一些东西来告诉任务调度程序将下一个任务出队,然后在该任务完成后返回到当前任务?
最佳答案
如果您有自己的 TaskScheduler
,TPL 不会安排任何事情,这是 TaskScheduler
的工作。
如果您想通过某种方式告诉自定义 TaskScheduler
安排另一个 Task
,您必须自行将其添加到您的 TaskScheduler
。而且您无法执行新的 Task
然后“返回”旧任务,因为无法暂停正在执行的 Task
。
但最简单的解决方案可能是使用默认的 TaskScheduler
,因为它在决定要执行多少个 Task
时会考虑阻塞的 Task
时间表。
关于c# - 当当前任务阻塞时,如何在 .NET 中安排另一项任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852801/