Parallel.ForEach的第一个循环

时间:2016-04-14 20:35:40

标签: c# parallel-processing parallel.foreach

我想在Parallel.ForEach的第一个循环中运行一些代码。仅在第一个循环中,以它为准。原因是将一些诊断数据写入由循环内的代码生成的磁盘。在第一个循环之后,数据将仅保留在内存中并在以后聚合。 这会有用吗?

bool firstLoop = true;
Parallel.ForEach(someList, 
    p=>
    {
        // do something here

        if (firstLoop)
        {
            firstLoop = false;

            // do something here for the first loop
        }
    });

2 个答案:

答案 0 :(得分:1)

正如我的评论中所提到的,这根本不会起作用。一种选择是创建锁并仅在锁内评估和更新firstLoop。但是,这会导致您失去一些并行性,并建议您寻找更好的方法,除非您在完成操作所需的时间内没有紧迫的需求。

请注意,这并不能保证firstLoop会在列表中的第一项上进行评估,只会认为它只会评估为真一次。

var someList = new List<string>();
var obj = new object();

for (int i = 0; i < 1000; i++)
{
    someList.Add(i.ToString());
}

bool firstLoop = true;
var rand = new Random(Guid.NewGuid().GetHashCode());
Parallel.ForEach(someList,
    p =>
    {
        // do something here
        var next = rand.Next(1, 100);
        Thread.Sleep(next);
        lock (obj)
        {
            if (firstLoop)
            {
                firstLoop = false;
                firstLoop.Dump();
                // do something here for the first loop
            }
        }
    });

答案 1 :(得分:1)

如果您需要在第一个项目上发生某些事情,而其余的迭代不依赖于正在完成的事情,您可以使用以下内容来查看您是否正在处理第一项

if (p==items.First())
{
    //Do something
}

如果你需要做一些其他循环依赖的东西那么你可以使用David建议的锁,或者你可以在Parallel.ForEach之前做你需要的东西

所以你可以做到

//Do stuff using someList(0)

Parallel.ForEach(someList.Skip(1), p=>