c# – 使用System.Threading.Tasks.Parallel在线程池中创建新线程?

c# – 使用System.Threading.Tasks.Parallel在线程池中创建新线程?,第1张

概述也许我不理解它…所有Parallel类问题:( 但是根据我现在正在阅读的内容,我理解当我使用Parallel时,我实际上调动了threadPool中存在的所有线程以执行某些任务/任务. 例如: var arrayStrings = new string[1000]; Parallel.ForEach<string>(arrayStrings, someString => { 也许我不理解它…所有Parallel类问题:(

但是根据我现在正在阅读的内容,我理解当我使用Parallel时,我实际上调动了threadPool中存在的所有线程以执行某些任务/任务.

例如:

var arrayStrings = new string[1000];  Parallel.ForEach<string>(arrayStrings,someString =>  {       DoSomething(someString);  });

因此,在这种情况下,Parallel.ForEach正在调动threadPool中存在的所有线程,用于“DoSomething”任务/任务.

但调用Parallel.ForEach会创建任何新线程吗?

很明显,没有1000个新线程.但是我们假设有1000个新线程,有些情况下threadPool会释放它所拥有的所有线程,在这种情况下…… Parallel.ForEach会创建任何新线程吗?

解决方法 简短回答:Parallel.ForEach()不会“动员所有线程”.并且在ThreadPool上调度某些工作的任何 *** 作(Parallel.ForEach()都可以)导致在池中创建新线程.

答案很简单:要正确理解这一点,您需要知道三个抽象级别如何工作:Parallel.ForEach(),TaskScheduler和ThreadPool:

> Parallel.ForEach()(和Parallel.For())在TaskScheduler上安排他们的工作.如果未明确指定调度程序,则将使用the current one.

Parallel.ForEach()在几个任务之间拆分工作.每个任务将处理输入序列的一部分,一旦完成,它将请求另一个部分(如果有的话),依此类推.

Parallel.ForEach()创建了多少个任务?尽管TaskScheduler会让它运行.这样做的方法是每个Task在开始执行时首先将自身的副本排入队列(除非这样做会违反MaxDegreeOfParallelism,如果你设置的话).这样,实际的并发级别取决于TaskScheduler.

此外,如果TaskScheduler支持,第一个Task将实际在当前线程上执行(这是使用RunSynchronously()完成的).
> The default TaskScheduler简单地将每个Task排入ThreadPool队列. (实际上,如果你从另一个Task启动一个Task会更复杂,但这里没有相关性.)其他TaskSchedulers可以做完全不同的事情,其中​​一些(如TaskScheduler.FromCurrentSynchronizationContext())完全不适合与Parallel.ForEach()一起使用.
> ThreadPool使用相当复杂的算法来确定在任何给定时间应该运行多少线程.但最重要的是调度新工作项可能会导致创建新线程(尽管不一定立即).并且因为使用Parallel.ForEach(),总会有一些项目排队执行,完全取决于ThreadPool的内部算法来决定线程数.

综上所述,几乎不可能确定Parallel.ForEach()将使用多少个线程,因为它依赖于许多变量.两种极端都是可能的:循环将在当前线程上完全同步运行,并且每个项目将在其自己的新创建的线程上运行.

但一般来说,应该接近最佳效率,您可能不必担心所有这些细节.

总结

以上是内存溢出为你收集整理的c# – 使用System.Threading.Tasks.Parallel在线程池中创建新线程?全部内容,希望文章能够帮你解决c# – 使用System.Threading.Tasks.Parallel在线程池中创建新线程?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1238700.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存