![](/img/trans.png)
[英]Is it possible to change parallelOptions.MaxDegreeOfParallelism during execution of a Parallel.ForEach
[英]Change Parallel.ForEach MaxDegreeOfParallelism while running?
假設我有一個Parallel.ForEach
在我的代碼中運行,並且ParallelOption
MaxDegreeOfParallelism
設置為Utils.Threads()
,如下所示:
Parallel.ForEach(linesList, new ParallelOptions { MaxDegreeOfParallelism = Utils.Threads() }, line => ...
現在,假設Utils.Threads()
返回的是1到10之間的隨機整數。
我的Parallel.ForEach
運行時, MaxDegreeOfParallelism
更改,或者是否始終將其設置為第一個Utils.Threads()
調用? 提前致謝。
我的Parallel.ForEach運行時,MaxDegreeOfParallelism是否會更改,或者是否始終將其設置為第一個Utils.Threads()調用? 提前致謝。
不可以,因為它不會一直檢查和修改分配的值,這在API初始化過程中是必需的。 實際上,如果您查看MaxDegreeOfParallelism
的簽名,
public int MaxDegreeOfParallelism { get; set; }
因為它的值類型不是引用類型,所以它是integer
,因此在任何情況下,都將復制值,因為值的任何更改都不會引用它,這是值類型的標准行為
MaxDegreeOfParallelism
對Parallel.ForEach
調用的影響
它是一個指示符或提示,它不能確保在執行開始之前從池中提供了許多並行線程。 對於Parallel.ForEach
它總是從單線程開始,並根據任務的數量和所花費的時間不斷追加並行執行的能力。 此值也在內部進行調節,不是您可以提供很高的值並期望提供許多線程。 盡管在PLinq
情況下,它的行為有所不同,在處理之前,它希望大多數線程都被PLinq
配置/初始化,但是如果由於上下文切換而每個線程沒有足夠的工作,它可能會對性能產生不利影響。
關於C#Parallel / PLinq API中DOP的幾個參考鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.