如何监视Parallel.ForEach中的进度

时间:2014-10-10 13:41:32

标签: c# multithreading locking task-parallel-library

我正在使用Parallel.ForEach下载500K网址,我想监控每分钟成功下载的网址数量。我现在在Parallel.ForEach循环中使用一个锁定语句来输出每分钟下载的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);
});

但是我担心锁定语句部分会影响perf。有没有其他方法可以实现这一目标?

1 个答案:

答案 0 :(得分:3)

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