【发布时间】:2016-12-28 06:17:48
【问题描述】:
编辑:
我注意到这些延迟峰值仅在 Visual Studio 中调试时发生。如果我在 Visual Stduio 之外运行 .exe,程序使用的 CPU 不会超过 3%。谁能告诉我为什么会这样?
我遇到了并行处理的问题。我正在使用 Parallel.For 检查大量代理(通过发出网络请求)。这是我的功能:
private ConcurrentBag<string> TotalProxies = new ConcurrentBag<string>();
private void CheckProxies()
{
ParallelOptions pOptions = new ParallelOptions();
pOptions.MaxDegreeOfParallelism = 100;
int max = TotalProxies.Count;
Invoke(new Action(() => { lbl_Status.Text = "Checking"; }));
Parallel.For(0, max, pOptions, (index, loopstate) =>
{
string Proxy = TotalProxies.ElementAt(index);
if (WebEngine.IsProxyWorking(Proxy))
{
WorkingProxies.Add(Proxy);
workingp++;
Invoke(new Action(() =>
{
lstv_Working.Items.Add(Proxy);
lbl_Working.Text = workingp.ToString();
}));
}
checkedp++;
Invoke(new Action(() => { lbl_Checked.Text = checkedp.ToString(); }));
if (Stop)
loopstate.Stop();
});
Invoke(new Action(() => {
lbl_Status.Text = "Idle";
}));
}
我的问题如下:
该程序在前 0-2000 个请求中运行良好,其中 cpu 使用率约为 3-5%。然后,在 2-3 分钟后,我遇到了大量且频繁的延迟峰值,导致 CPU 使用率跃升至 100% .我不知道为什么会发生这种情况,因为它一直运行良好。我希望有人能帮助我了解导致这种情况的原因。
这里可以看到我的问题:
【问题讨论】:
-
另外,这在几天前可以正常工作。现在我没有对代码进行任何更改就遇到了这个问题..
-
您或许可以使用分析器来检查代码的哪一部分占用了 CPU。自从代码正常工作以来,您没有更改代码中的任何内容这一事实使我认为其中一个 HttpRequest 调用的行为可能与几天前的行为不同,这很可能是因为另一端的某些行为的行为不同(网站)。
-
@o_weisman 如何使用分析器?我使用了默认的诊断工具以及导致最多 cpu 使用的原因,它说的是外部代码。这是什么意思?
-
另外,这方面(网站)没有问题,因为我尝试了不同的,但我有同样的问题
-
首先是一个小旁注:
++如checkedp++不是原子的,在竞争条件下可能会给出错误的结果。使用Interlocked.Increment更安全。也就是说,锁定会导致挂断,尽管我不知道它们是否会导致 CPU 峰值。但只要您调用而不是锁定变量本身,您就可以尝试在没有locks 的情况下运行。总而言之,由于等待的是 IO,所以最好使用async...await构造。这也将消除对潜在大量线程的需求 (MaxDegreeOfParallelism)
标签: c# multithreading cpu-usage webrequest parallel.for