C# 任务长时间运行的副作用?
如果使用LongRunning选项创建任务,由于它们不使用ThreadPoolLongRunning任务,是否有任何副作用,表明将绕过全局队列和本地队列,以防止其阻塞本地队列中紧随其后的其他线程 这意味着,如果你有很多长时间运行的任务,它可能会创建比正常更多的线程 你可以从这个问题的答案中看到一些缺点:C# 任务长时间运行的副作用?,c#,.net,multithreading,.net-4.0,task-parallel-library,C#,.net,Multithreading,.net 4.0,Task Parallel Library,如果使用LongRunning选项创建任务,由于它们不使用ThreadPoolLongRunning任务,是否有任何副作用,表明将绕过全局队列和本地队列,以防止其阻塞本地队列中紧随其后的其他线程 这意味着,如果你有很多长时间运行的任务,它可能会创建比正常更多的线程 你可以从这个问题的答案中看到一些缺点: 是。副作用是:若你们有一百万个任务,你们可能会创建一百万个线程 需要考虑到每个线程将带来其内存开销和上下文切换开销。内存开销并不是那么小,我们这里讲的是几MB,因此即使有数千项,您可能会遇到麻烦
是。副作用是:若你们有一百万个任务,你们可能会创建一百万个线程
需要考虑到每个线程将带来其内存开销和上下文切换开销。内存开销并不是那么小,我们这里讲的是几MB,因此即使有数千项,您可能会遇到麻烦。长时间运行选项是对调度程序的提示,这意味着它可以选择在非线程池线程上执行任务(如果是线程池备份的
默认调度程序
,则很可能会)。LongRunning
选项的一个副作用是不允许对该任务进行任务内联。这意味着,如果长时间运行
任务创建其他嵌套或子任务,并对其中任何一个任务调用等待
,则它们将始终在不同的线程上执行,而不是内联执行(即,在执行等待
的同一线程上运行)
在其他人回答的上下文中,值得注意的是,由于
DefaultScheduler
使用的线程注入算法,在没有LongRunning
提示的情况下创建大量需要很长时间才能完成的任务仍然可能导致线程数量的增加。该算法不区分池中被阻止的线程和已运行工作项很长时间的线程,在这两种情况下,都可以通过向池中注入更多线程来响应,以尝试增加工作吞吐量。在浏览器中输入问题标题时,自动完成是否起作用?:)我找到了!更新为更清晰一点(希望更符合MSDN所说的内容)的Reflector显示,从.NET4.0开始,提示始终得到遵守。