C# 在并行for循环中添加到sortedlist错误:ArgumentException未被用户代码错误处理

C# 在并行for循环中添加到sortedlist错误:ArgumentException未被用户代码错误处理,c#,collections,sortedlist,parallel.foreach,C#,Collections,Sortedlist,Parallel.foreach,“items”是一个ConcurrentStack,其值为product id、name和details,由一个选项卡分隔 例: items[0]=1\tshampoo\t表示您的头发 我有一个并行循环,将项目拆分为3个数组索引(拆分器),然后将其添加到“productList”中,“productList”是一个SortedList。当我将拆分后的值添加到productList时,id现在应该是键,name+details是值 例: 拆分器[0]=1;拆分器[1]=洗发水;splitter[2

“items”是一个ConcurrentStack,其值为product id、name和details,由一个选项卡分隔

例:

items[0]=1\tshampoo\t表示您的头发

我有一个并行循环,将项目拆分为3个数组索引(拆分器),然后将其添加到“productList”中,“productList”是一个SortedList。当我将拆分后的值添加到productList时,id现在应该是键,name+details是值

例:

拆分器[0]=1;拆分器[1]=洗发水;splitter[2]=清洁头发

productList[0]键=1;productList[1]value=洗发水\t表示您的头发

奇怪的是,有时程序运行得完美无缺,有时它会提示一个错误。用户代码错误未处理异常。以下是错误的详细信息: “偏移量和长度超出了数组的界限,或者计数大于从索引到源集合结尾的元素数。”。使用平行线与此有关吗?问题是我必须使用并行程序来更快地执行循环

注:数据仅为样本

更新:
我尝试用var splitter更改string[]splitter,结果出现错误:“目标数组不够长。请检查destIndex和length,以及数组的下限。”。我在即时窗口中检查了productList,并在出现此错误之前添加了一些数据。

您的代码可能有两个不同的问题:1)没有人保证sortedlist的线程安全2)您确定引发异常的不是
Convert.ToInt32
?顺便说一句,我不确定你能想当然地认为这段代码在并行执行中执行得更快。最后,锁定同一个集合(productList),这将是本例中的瓶颈。是的,可能是在并行for循环中添加到sortedlist。有时程序运行正常,所以我认为它与int转换无关。当错误发生时,我尝试在即时窗口中检查productList(sortedlist)的内容,在出现错误之前,productList中已经添加了一些值。在多线程场景中,任何时候如果要对不安全的数据结构进行更改,都需要锁定它,进行更改,然后打开它。如果不这样做,可能会有两个或多个线程同时尝试编辑它,这通常会导致您描述的问题。此外,还需要检查数据结构:允许多个线程始终读取数据结构是否安全?如果没有(如果您必须锁定它才能编辑它,则不是这样),那么您需要锁定它只是为了读取它,以保证在读取时它不会被更改。
items.AsParallel().ForAll(i =>
{
string[] splitter = i.Split('\t');
Console.WriteLine(string.Format("Converted: {0} - {1} - {2}", splitter[0], splitter[1], splitter[2]));
productList.Add(Convert.ToInt32(splitter[0]), splitter[1] + "\t" + splitter[2]);
// the above line is where the error prompts
});