我正在使用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。有没有其他方法可以实现这一目标?
答案 0 :(得分:3)
而不是要求每个并行任务与其他所有任务同步,只需创建一个单独的资源(Timer
似乎是此处的最佳工具),可以每分钟检查已完成操作的计数,你的循环只需要增加一个计数器。