簡體   English   中英

當袋子中只有2件物品時,處理ConcurrentBag會顯示5000多個任務

[英]Processing a ConcurrentBag shows over 5000 tasks when only 2 items in bag

此處在Microsoft上找到以下ConcurrentBag示例。

我正在調試單元測試和某種檢查方式,bagConsumeTasks中包含5000多個項目。 這正常嗎? 袋子里只有2個主題。

在此處輸入圖片說明

HashSet<string> x = new HashSet<string>();
List<Task> bagConsumeTasks = new List<Task>();
int itemsInBag = 0;
while (!result.IsEmpty)
{
    bagConsumeTasks.Add(Task.Run(() =>
    {
        string item;
        if (result.TryTake(out item))
        {
            x.Add(item);
            itemsInBag++;
        }
    }));
}
Task.WaitAll(bagConsumeTasks.ToArray());

在檢查result.IsEmpty和任務消耗項之間存在着競爭,導致代碼啟動了比所需更多的任務。

許多任務並行執行的局部變量itemsInBag的增量也是一個競賽,但是可以通過在其之前調用Console.WriteLine來緩解。

盡管在某些情況下這可能是一個錯誤,但我想這里可能故意安排了過多的任務,以證明該類在高競爭中運行?

因為沒有其他東西在使用並發包,所以該示例只能創建固定數量的Task:

    List<Task> bagConsumeTasks = new List<Task>();
    int itemsInBag = 0;
    for (int i = 0; i < 500; i++)
    {
        bagConsumeTasks.Add(Task.Run(() =>
        {
            int item;
            if (cb.TryTake(out item))
            {
                Console.WriteLine(item);
                Interlocked.Increment(ref itemsInBag);
            }
        }));
    }
    Task.WaitAll(bagConsumeTasks.ToArray());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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