2

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

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

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

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

4

3 回答 3

2

如果你有自己的TaskScheduler,TPL 不会安排任何事情,那是TaskScheduler.

如果您想以某种方式告诉您的自定义TaskScheduler安排另一个Task,您必须自己将其添加到您TaskScheduler的。而且你不能执行新Task的然后“回到”旧的,因为没有办法暂停正在执行的Task.

但最简单的解决方案可能是使用 default TaskScheduler,因为它在决定调度Task多少 s 时会考虑到被阻塞的 s 。Task

于 2012-06-01T17:28:05.917 回答
0

没有内置这样的东西。为避免此类问题,请使用非阻塞任务。

您还可以通过使您自己的自定义 TaskScheduler 并行运行比 CPU 更多的线程来稍微超额订阅 CPU。这将导致轻微的低效率,但如果任务阻塞,您有其他“回填”任务已经在运行并接管 CPU。

于 2012-06-01T15:40:51.833 回答
0

Task.ContinueWith 确实为您提供了在初始任务完成或故障后安排任务的选项。但这仅在初始任务运行完成时才有帮助。

于 2012-06-01T15:24:19.913 回答