Parallel.ForEach 的第一个循环
First loop of a 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
}
});
正如我在评论中提到的,这根本不能保证有效。一种选择是创建一个锁并仅在锁内评估和更新 firstLoop
。但是,这会导致您失去一些并行性,并建议您寻找更好的方法,除非您在完成操作所需的时间内没有紧迫的需求。
请记住,这并不能保证 firstLoop
将对列表中的第一项进行评估,只是它只会被评估为 true 一次。
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
}
}
});
如果您需要对第一项进行处理,而其余迭代不依赖于正在执行的操作,您可以使用以下命令查看您是否正在处理第一项
if (p==items.First())
{
//Do something
}
如果您需要做一些其他循环将依赖的事情,那么您可以按照 David 的建议使用锁,或者您可以在 Parallel.ForEach
之前做您需要的事情
所以你可以
//Do stuff using someList(0)
Parallel.ForEach(someList.Skip(1), p=>
我想 运行 在 Parallel.ForEach 的第一个循环中添加一些代码。仅在第一个循环中。原因是将一些诊断数据写入由循环内的代码生成的磁盘。在第一个循环之后,数据将只保存在内存中并在以后聚合。 这行得通吗?
bool firstLoop = true;
Parallel.ForEach(someList,
p=>
{
// do something here
if (firstLoop)
{
firstLoop = false;
// do something here for the first loop
}
});
正如我在评论中提到的,这根本不能保证有效。一种选择是创建一个锁并仅在锁内评估和更新 firstLoop
。但是,这会导致您失去一些并行性,并建议您寻找更好的方法,除非您在完成操作所需的时间内没有紧迫的需求。
请记住,这并不能保证 firstLoop
将对列表中的第一项进行评估,只是它只会被评估为 true 一次。
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
}
}
});
如果您需要对第一项进行处理,而其余迭代不依赖于正在执行的操作,您可以使用以下命令查看您是否正在处理第一项
if (p==items.First())
{
//Do something
}
如果您需要做一些其他循环将依赖的事情,那么您可以按照 David 的建议使用锁,或者您可以在 Parallel.ForEach
之前做您需要的事情所以你可以
//Do stuff using someList(0)
Parallel.ForEach(someList.Skip(1), p=>