2011-10-27 75 views
21

如果使用长时间运行选项创建任务,那么会有任何副作用,因为它们不使用线程池任务长期运行的副作用?

+0

http://stackoverflow.com/questions/3105988/task-parallel-library-taskcreationoptions-longrunning-option-and-threadpool做自动完成的工作,当你在浏览器中输入问题的标题? :) –

+0

我找到了! http://msdn.microsoft.com/en-us/library/dd997402.aspx – Aliostad

回答

16

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

需要考虑到每个线程将带来其内存开销上下文切换开销。内存开销并不小,我们都这么甚至上千项,你可以遇到麻烦说话几MB这里。

5

长时间运行任务表明全局和本地队列将被绕过,以防止其阻塞其他线程在本地队列之后。

这意味着,如果你有很多这样的长时间运行的任务,它可以创造出比正常更多的线程。

可以在答案看到在这个问题上的一些弊端:

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

+0

更新为更清楚一点(希望更多的在线与MSDN说什么) – Holger

26

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

在别人的答案的背景下,值得注意的是,创造了大量需要很长时间的任务完成LongRunning暗示仍可能导致线程数升级由于线DefaultScheduler使用的注入算法。该算法不被阻止和那些已经运行的工作项长一段时间,并在两种情况下可以通过注入更多的线程入池回应,试图提高工作通量的池中的线程之间进行区分。

+7

Reflectoring显示提示,作为.NET 4.0,总是服从。 – usr