我正在使用 Parallel.ForEach
下载 500K 个 URL,并且我想监控每分钟成功下载的 URL 数量。我现在在 Parallel.ForEach 循环中使用 lock 语句来输出每分钟下载的 URL 数量:
int elapsedMinutes = 0, cnt = 0;
Parallel.ForEach(list, tuple =>
{
var currMinutes = (int) ((DateTime.Now - startTime).TotalMinutes);
lock (Object)
{
if (currMinutes > elapsedMinutes)
{
elapsedMinutes = currMinutes;
Console.WriteLine("{0}: Extracted {1} urls", DateTime.Now, cnt);
}
}
//download urls ...
Interlocked.Increment(ref cnt);
});
但我担心锁定语句部分会影响性能一点。还有其他方法可以实现这一目标吗?
最佳答案
与其要求每个并行任务与所有其他并行任务同步,只需创建一个单独的资源(Timer
似乎是这里最好的工具),该资源可以检查每个并行任务已完成操作的计数分钟,让你的循环只需要增加一个计数器。
关于c# - 如何监控 Parallel.ForEach 的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26300887/