如何在Parallel.ForEach中监控进度
本文关键字:监控 ForEach Parallel | 更新日期: 2023-09-27 18:26:16
我正在使用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
似乎是这里最好的工具),它可以检查每分钟完成的操作数,让循环只需要增加一个计数器。