如何在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);
});

但我担心锁语句部分会影响性能。有没有其他方法可以实现这一点?

如何在Parallel.ForEach中监控进度

与其要求每个并行任务都与所有其他任务同步,不如创建一个单独的资源(Timer似乎是这里最好的工具),它可以检查每分钟完成的操作数,让循环只需要增加一个计数器。