ConcurrentDictionary や ConcurrentQueue などの新しい .NET 同時実行コレクションのいくつかを知り、キューに並列に書き込むとどうなるかを確認するためにいくつかのテストを実行していました。
だから私はこれを実行しました:
private static void ParallelWriteToQueue(Queue<int> queue)
{
Stopwatch sw = Stopwatch.StartNew();
Parallel.For(1,1000001,(i) => queue.Enqueue(i));
sw.Stop();
Console.WriteLine("Regular int Queue - " + queue.Count + " time" + sw.ElapsedMilliseconds);
}
そして、私が次の例外を得たと思った:
Source array was not long enough. Check srcIndex and length, and the array's lower bounds.
したがって、この Queue は予測どおりに同時エンキューを処理できません。
でも、キューの型を文字列に変えたら例外なく、結果は
Regular string Queue - 663209 time117
これは、約 663k だけがキューに入れられたことを意味します。
なぜ例外がなかったのですか?
エンキューされていないすべてのアイテムはどうなりましたか?
これは Queue と同じ機能です
private static void ParallelWriteToQueue(Queue<string> queue)
{
Stopwatch sw = Stopwatch.StartNew();
Parallel.For(1, 100001, (i) => queue.Enqueue(i.ToString()));
sw.Stop();
Console.WriteLine("Regular string Queue - " + queue.Count + " time" + +sw.ElapsedMilliseconds);
}