这里代码就此关注:
while (true)
{
Console.WriteLine("start " + DateTime.Now);
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = -1;
Parallel.ForEach(hosts, item =>
{
using (Ping ping = new Ping())
{
PingReply pingReply = ping.Send(item.Value, 2000); // timeout is 2 secs
App.dict[item.Key].lastConnectTry = new KeyValuePair<bool, DateTime>((pingReply.Status == IPStatus.Success), DateTime.Now);
}
});
Console.WriteLine("end " + DateTime.Now);
Thread.Sleep(15000);
}
但是,然后我运行该应用程序,结果却略有不同:
start 27.04.2012 10:12:32
end 27.04.2012 10:12:42
// it took 10 seconds
start 27.04.2012 10:12:57
end 27.04.2012 10:13:02
// this took 5 secs
start 27.04.2012 10:13:17
end 27.04.2012 10:13:22
// 5 secs
start 27.04.2012 10:13:37
end 27.04.2012 10:13:42
// 5 secs
start 27.04.2012 10:13:57
end 27.04.2012 10:14:01
start 27.04.2012 10:14:16
end 27.04.2012 10:14:19
start 27.04.2012 10:14:34
end 27.04.2012 10:14:36
start 27.04.2012 10:14:51
end 27.04.2012 10:14:54
start 27.04.2012 10:15:09
end 27.04.2012 10:15:11
start 27.04.2012 10:15:26
end 27.04.2012 10:15:29
start 27.04.2012 10:15:44
end 27.04.2012 10:15:46
start 27.04.2012 10:16:01
end 27.04.2012 10:16:06
start 27.04.2012 10:16:21
end 27.04.2012 10:16:24
start 27.04.2012 10:16:39
end 27.04.2012 10:16:41
start 27.04.2012 10:16:56
end 27.04.2012 10:16:59
start 27.04.2012 10:17:14
end 27.04.2012 10:17:16
似乎需要一些时间来引导线程,创建线程,然后并行执行时间才能正确安排.
所以问题是为什么处理所有处理都需要2秒钟以上的时间,如何在处理之前引导线程来避免这种情况呢?
更新:
该循环位于单独的后台线程中.
解决方法:
是的,线程池需要根据负载来增加线程数(与Parallel.ForEach不相关).
检查Parallel.ForEach not spinning up new threads和Parallel.Foreach spawning way too many threads的某些背景.