cle*_*aks 4 c# linq multithreading plinq
我的代码做的很简单
列表已经有元素.我在列表中有大约25000个元素(我希望有更多元素),每个元素都很小(DateTime).
List<DateTime> newList = new List<DateTime>();
Parallel.ForEach(list, l => newlist.Add(new DateTime(l.Ticks + 5000)));
Run Code Online (Sandbox Code Playgroud)
也就是说,基于每个元素,我正在创建新元素并将它们添加到不同的列表中.但是,这似乎不是一个好的编程方法.我打这个例外一些时间,但不是每次.
IndexOutOfRangeException : {"Index was outside the bounds of the array."}
Run Code Online (Sandbox Code Playgroud)
我们可以使用Parallel.ForEach()将元素添加到列表中吗?如果是,为什么我会遇到错误?如果不是,为什么?
在这种情况下你真正想要的更像是这样的:
newlist = list.AsParallel().Select(l => new DateTime(l.Ticks + 5000)).ToList();
Run Code Online (Sandbox Code Playgroud)
虽然您应该测量性能,看看这种情况是否会从并行化中获益.
小智 5
尝试一个带有最终结果的线程局部变量,将所有线程局部变量添加到newList中......
Parallel.ForEach(list, () => DateTime.MinValue, (l, state, date) =>
{
date = new DateTime(l.Ticks+5000);
return date;
},
finalresult =>
{
lock (newList)
{
newList.Add(finalresult);
}
});
Run Code Online (Sandbox Code Playgroud)
第一个参数是你的旧列表,第二个参数是每个线程的初始值(我刚刚初始化为datetime min).第三个参数块如下 - l与代码中的相同; state是一个Paralleloption对象,如果你选择,你可以退出并行循环; 最后一个是代表线程局部变量的变量中的stand.finalresult参数表示每个线程局部变量的最终结果,并为每个线程调用 - 在那里,您可以放置newList的锁并添加到newList共享变量.理论上这是有效的.我在自己的代码中使用了类似的编码.希望这可以帮助你或其他人.
归档时间: |
|
查看次数: |
11990 次 |
最近记录: |