[英]Limit number of tasks with TPL
我正在研究創建需要在多個線程上執行的任務。 我可以創建大量任務,例如2000。 我想限制同時排隊和執行的任務數量。 有沒有辦法創建一定數量的任務,然后在完成后創建新任務? 如果任務調度程序有助於解決此問題,請嘗試解決此問題。
編輯:
用不同的方式來表達這個...有一個原因我應該想要限制同時創建/排隊/執行的任務數量,因為我可以擁有一個非常大的數字,例如2000.任務調度程序是否能最佳地安排任務,可以'似乎找到任何關於它如何工作的信息......
編輯:
我沒有使用Parallel.Foreach。 我決定使用計數器,根據最大計數器數,當前任務數,創建任務或等到最大數量不超過。
如果你想發送2000封電子郵件,你不想阻止當前的線程,並且你只想使用有限數量的線程,那么我認為你應該使用一個調用Parallel.ForEach()
Task
。 就像是:
List<Email> emails = …;
var task = Task.Factory.StartNew(() =>
{
Parallel.ForEach(
emails,
new ParallelOptions { MaxDegreeOfParallelism = maxNumberOfThreads },
email => email.Send());
});
// handle the completion of task here
如果您不知道最佳線程數,那么您必須通過實驗找到它。 TPL能夠合理地猜測CPU綁定計算的最佳線程數。 但是你的代碼不受CPU限制,它受網絡限制,這意味着最佳線程數與CPU的內核數量無關,這取決於網絡連接的帶寬和延遲(也可能是你的郵件服務器)。
在評論中回答問題:
“我不明確知道有多少核......”
您可以使用Environment.ProcessorCount
獲取核心數,並使用它們來設置MaxDegreeOfParallelism
:
ParallelOptions po = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
};
是的,人們可能經常想要限制或調整並行任務(.NET線程池)提供的新線程的默認生成。 有很多這樣的討論:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.