【问题标题】:Task LongRunning side effects?任务 LongRunning 的副作用?
【发布时间】:2011-12-16 11:42:18
【问题描述】:

如果使用 LongRunning 选项创建任务是否有任何副作用,因为它们不使用线程池

【问题讨论】:

标签: c# .net multithreading .net-4.0 task-parallel-library


【解决方案1】:

LongRunning 选项是对调度程序的提示,这意味着它可以选择在非线程池线程上执行 Task(如果它是支持 DefaultScheduler 的线程池很可能会)。 LongRunning 选项的一个副作用是该任务不允许任务内联。这意味着如果LongRunning 任务创建其他嵌套或子任务并在任何这些任务上调用Wait,它们将始终在不同的线程上执行而不是被内联(即在执行@987654327 的同一线程上运行@)。

在其他人的答案的上下文中,值得注意的是,创建大量需要很长时间才能完成的任务没有LongRunning提示仍然可能导致数量升级由于DefaultScheduler 使用的线程注入算法导致的线程数。该算法不区分池中被阻塞的线程和已长时间运行工作项的线程,并且在这两种情况下都可以通过向池中注入更多线程来尝试增加工作吞吐量来做出响应。

【讨论】:

  • 反射表明,从 .NET 4.0 开始,提示始终得到遵守。
【解决方案2】:

是的。副作用是:如果你有一百万个任务,你可能会创建一百万个线程。

需要考虑到每个线程都会带来它的内存开销上下文切换开销。内存开销不是那么小,我们说的是几个MB 在这里,即使有数千个项目,您也可能会遇到麻烦。

【讨论】:

    【解决方案3】:

    LongRunning 任务,表示将绕过全局和本地队列,以防止它阻塞本地队列中跟随它的其他线程。

    这意味着,如果您有很多此类长时间运行的任务,它可能会创建比平常更多的线程。

    你可以在这个问题的答案中看到一些缺点:

    http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/8304b44f-0480-488c-93a4-ec419327183b

    【讨论】:

    • 更新得更清楚了(希望更符合 MSDN 的说法)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2020-05-25
    • 2012-09-19
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多