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