c# - 如何监控 Parallel.ForEach 的进度

标签 c# multithreading locking task-parallel-library

我正在使用 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/

相关文章:

c# - 用完全相同的代码合并 catch block ?

python - 如何在 Python 中仅在程序退出临界区后处理 SIGTERM?

c++ - 如何使用互斥使两个线程严格交替?

java - 这些方法是线程安全的吗?

c++ - 第一次锁定和创建 lock_guard(adopt_lock) 和创建 unique_lock(defer_lock) 和锁定有什么区别?

oracle - 我可以用来防止行被插入到 Oracle 表中的侵入性最小的锁定机制是什么?

c# - 系统.Data.OleDb.OleDbException : Too many fields defined

C#:如何解析 HttpWebResponse 对象?

c# - 更新 ASP .Net MVC 中的记录

c++ - boost中有没有一个函数可以查找有多少人正在等待互斥锁?