带有列表的C#中的基本多线程

qwe*_*234 0 c# multithreading

当您在多个线程中在C#中新建一个新列表时,每个线程是否都有自己的列表实例?

所以我的代码看起来类似于:

List<Item> _items = new List<Item>();

public void Method(List<List<Batch>> batches) {
    Parallel.ForEach(batches, parallelOptions, (batch, state) => CalculateAndAddToList(batch))
}

private void CalculateAndAddToList(List<Batch> batch) {
 //Some computations
    var localItems = new List<Item>();
    foreach(var b in batch) {
        //Computations of newItems
        localItems.AddRange(newItems);
    }
    _items.AddRange(items);
}
Run Code Online (Sandbox Code Playgroud)

我将随机得到一个错误:"目标数组不够长.检查destIndex和长度,以及数组的下限." 在该行说:"localItems.AddRange(newItems)".由于每个线程都在新建自己的localitems列表实例,我认为其他线程不会改变它,所以为什么在该行上出现错误?

我想我需要围绕"_items.AddRange(项目)"的锁,因为多个线程同时访问和更改共享领域"_items",但我还没有得到一个线程错误扔在这条线.

spe*_*der 5

每个线程都可以拥有它自己的列表.你看到的问题源于这一行:

_items.AddRange(items);
Run Code Online (Sandbox Code Playgroud)

可能同时从两个线程调用.List<T>不是线程安全的.使用线程安全容器,例如ConcurrentBag<T>,或者更好的是,使用PLINQ重述您的问题,并允许框架安全地为您收集结果.你可以通过避免将源数据分成批次并在并行linq中声明转换来节省大量代码.它为您完成所有这些.

http://blogs.msdn.com/b/pfxteam/archive/2009/05/28/9648672.aspx