众所周知,List<T> 集合是非线程安全的,所以我们采用并行编程时会发生丢数据的情况。比如我们通过多线程将一千个对象加入 List<T>,我们最终得到的集合中元素数就会小于一千。
如下测试代码,通过多任务对象 Task 实现将一千个对象加入到 List<T> 中,添加了一千次,但实际上最终的 objects.Count() 值为 < 1000。但如果将集合名称改成 ConcurrentBag<T>,结果就不会丢失,最终为等于 1000。
代码语言:javascript复制static void Main(string[] args)
{
try
{
// List<MyObject> objects = new List<MyObject>();
ConcurrentBag<MyObject> objects = new ConcurrentBag<MyObject>();
Task[] tasks = new Task[1000];
for (int i = 0; i < 1000; i )
{
tasks[i] = Task.Run(() =>
objects.Add(new MyObject() { Name = "1", Threadnum = Thread.GetCurrentProcessorId() }));
}
Task.WaitAll(tasks); // 等待所有任务完成
Console.WriteLine(objects.Count()); // List<T>:913;ConcurrentBag<T>:1000
Console.ReadLine();
}
catch (Exception ex)
{
}
}
public class MyObject
{
public string Name { get; set; }
public int Threadnum { get; set; }
}
最近在优化程序,尽量不用自己造的轮子,优先使用官方现成的。