任务LongRunning副作用?

时间:2011-10-27 12:40:37

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

如果使用LongRunning选项创建了Task,那么会有任何副作用,因为它们不使用ThreadPool

3 个答案:

答案 0 :(得分:26)

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

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

答案 1 :(得分:16)

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

需要考虑到每个线程都会带来内存开销上下文切换开销。内存开销不小,我们正在谈论一些MB 这里即使有成千上万的物品,也可能遇到麻烦。

答案 2 :(得分:5)

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

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

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

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