c# – Parallel.ForEach同时保留订单

我有一个List< byte []>我喜欢将每个byte []反序列化为Foo.列表是有序的,我喜欢写一个并行循环,其中得到的List< Foo>包含与原始byte []相同顺序的所有Foo.该列表非常大,可以使并行操作变得有价值.有没有内置的方法来实现这一目标?

如果没有,任何想法如何实现同步运行这一切的加速?

谢谢

解决方法

从你给出的信息中,我知道你想要一个Foo的输出数组,其大小等于输入的字节数组?它是否正确?

如果是这样,是的,操作很简单.不要理会锁定或同步构造,这些会侵蚀并行化带给您的所有速度.

相反,如果遵守这个简单的规则,任何算法都可以并行化,而无需锁定或同步:

For each input element X[i] processed,you may read from any input element X[j],but only write to output element Y[i]

查找Scatter / Gather,这种类型的操作称为聚集,因为只写入一个输出元素.

如果你可以使用上面的原则,那么你想要在前面创建输出数组Foo [],并在输入数组上使用Parallel.For not ForEach.

例如.

List<byte[]> inputArray = new List<byte[]>();
        int[] outputArray = new int[inputArray.Count];

        var waitHandle = new ManualResetEvent(false);
        int counter = 0;

        Parallel.For(0,inputArray.Count,index =>
            {
                // Pass index to for loop,do long running operation 
                // on input items
                // writing to only a single output item
                outputArray[index] = DoOperation(inputArray[index]);

                if(Interlocked.Increment(ref counter) == inputArray.Count -1)
                {
                    waitHandle.Set();
                }
            });

        waitHandler.WaitOne();

        // Optional conversion back to list if you wanted this
        var outputList = outputArray.ToList();

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...