簡體   English   中英

使用TPL限制任務數量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM