C#基础之线程安全集合讲解

partitioner = Partitioner.Create(data, EnumerablePartitionerOptions.NoBuffering); // 并行处理结果 Parallel.ForEach(partitioner, (item, state, index) => {

Console.WriteLine($"处理元素开始: {item}, 原始索引: {index},时间:{DateTime.Now.ToString("HH:mm:ss:fff")}");
// 模拟处理逻辑
Thread.Sleep(100);
result[index] = item;

}); Console.WriteLine($“result中的元素为:{string.Join(”,“, result)},时间:{DateTime.Now.ToString(”HH:mm:ss:fff“)}”);

输出:
```shell
处理元素开始: 6, 原始索引: 5,时间:14:29:23:015
处理元素开始: 7, 原始索引: 6,时间:14:29:23:019
处理元素开始: 8, 原始索引: 7,时间:14:29:23:019
处理元素开始: 2, 原始索引: 1,时间:14:29:23:019
处理元素开始: 3, 原始索引: 2,时间:14:29:23:019
处理元素开始: 5, 原始索引: 4,时间:14:29:23:019
处理元素开始: 9, 原始索引: 8,时间:14:29:23:015
处理元素开始: 1, 原始索引: 0,时间:14:29:23:015
处理元素开始: 10, 原始索引: 9,时间:14:29:23:015
处理元素开始: 4, 原始索引: 3,时间:14:29:23:015
result中的元素为:1,2,3,4,5,6,7,8,9,10,时间:14:29:23:155

从输出可以看到,因为在每个任务处理时,能够明确知道当前任务的索引,所以也就能够处理使得结果顺序跟源顺序一致,从时间戳来看,完成10个耗时100秒的任务,总时间只用了100多毫秒,充分利用了CPU多线程性能。

总结

上述就是对 System.Collections.Concurrent 命名空间的所有成员做了比较详细的说明和应用了,我们可以通过合理选择这些集合类,可以显著简化多线程编程,同时保证高性能与线程安全。 参考链接 > > > [1] https://learn.microsoft.com/en-us/dotnet/api/system.collections.concurrent?view=net-9.0 >