对于我的MSDN4.0项目,我使用了一个具有有限并发程度的自定义TaskScheduler
(类似于.NET上的LimitedConcurrencyLevelTaskScheduler示例)。它执行的一堆任务在等待其他操作返回结果时阻塞,然后继续他们的工作。因为遗憾的是,这个调度程序的线程在这段时间内没有任何事情可做,所以我想在一个阻塞时调度另一个任务。
我想也许第三方公共关系可以看到任务何时阻塞,然后调度其他任务,但我使用Monitor.Wait()
或等待ManualResetEvent
的实验表明情况并非如此。因为我已经在使用我自己的任务调度程序了,我想可能有办法明确地告诉它调度另一个任务,但我还没有在Task
,TaskScheduler
等上找到任何方法来做到这一点。
请注意,延续在这里不起作用,因为我正在执行一个任务。此外,我真的希望避免将任务分成两部分,一个等待前任务和一个等待后任务,因为可能有几个点需要等待,而将它们全部分开会导致我的原始算法出现一定程度的碎片,这将使维护变得困难。我想像来自Async CTP的await
之类的东西会很有帮助,但我必须坚持使用.NET 4。
我是否遗漏了什么,无法告诉任务调度程序将下一个任务出队,然后在该任务完成后返回到当前任务?
发布于 2012-06-02 01:28:06
如果您有自己的TaskScheduler
,则第三方公共关系不会调度任何内容,这是TaskScheduler
的工作。
如果您希望以某种方式告诉您的自定义TaskScheduler
安排另一个Task
,则必须自己将其添加到您的TaskScheduler
中。而且您不能执行新的Task
,然后“返回”到旧的Task
,因为没有办法暂停正在执行的back。
但最简单的解决方案可能是使用默认的TaskScheduler
,因为它在决定调度多少个Task
时会考虑阻塞的Task
。
发布于 2012-06-01 23:24:20
Task.ContinueWith为您提供了在初始任务完成后安排任务的选项,或者faulted.but,这仅在初始任务运行到完成时才有帮助。
发布于 2012-06-01 23:40:52
没有这种东西是内置的。要避免类似的问题,请使用非阻塞任务。
您还可以通过使您自己的自定义TaskScheduler并行运行比CPU更多的线程来略微超额订阅CPU。这将导致轻微的效率低下,但在任务阻塞的情况下,您已经有其他“回填”任务正在运行并接管CPU。
https://stackoverflow.com/questions/10852801
复制相似问题