首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当当前任务处于阻塞状态时,如何在.NET中调度另一个任务?

当当前任务处于阻塞状态时,如何在.NET中调度另一个任务?
EN

Stack Overflow用户
提问于 2012-06-01 23:06:29
回答 3查看 359关注 0票数 2

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

我想也许第三方公共关系可以看到任务何时阻塞,然后调度其他任务,但我使用Monitor.Wait()或等待ManualResetEvent的实验表明情况并非如此。因为我已经在使用我自己的任务调度程序了,我想可能有办法明确地告诉它调度另一个任务,但我还没有在TaskTaskScheduler等上找到任何方法来做到这一点。

请注意,延续在这里不起作用,因为我正在执行一个任务。此外,我真的希望避免将任务分成两部分,一个等待前任务和一个等待后任务,因为可能有几个点需要等待,而将它们全部分开会导致我的原始算法出现一定程度的碎片,这将使维护变得困难。我想像来自Async CTP的await之类的东西会很有帮助,但我必须坚持使用.NET 4。

我是否遗漏了什么,无法告诉任务调度程序将下一个任务出队,然后在该任务完成后返回到当前任务?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-02 01:28:06

如果您有自己的TaskScheduler,则第三方公共关系不会调度任何内容,这是TaskScheduler的工作。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-06-01 23:24:20

Task.ContinueWith为您提供了在初始任务完成后安排任务的选项,或者faulted.but,这仅在初始任务运行到完成时才有帮助。

票数 0
EN

Stack Overflow用户

发布于 2012-06-01 23:40:52

没有这种东西是内置的。要避免类似的问题,请使用非阻塞任务。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10852801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档