c# - Parallel.ForEach 花费的时间比预期的多

标签 c# .net multithreading parallel-processing threadpool

这里是关于这个问题的代码:

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 threadsParallel.Foreach spawning way too many threads一些背景。

关于c# - Parallel.ForEach 花费的时间比预期的多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10344638/

相关文章:

c# - 从 double 到 byte 的转换会产生意想不到的结果

C# 运行多个查询的最佳方式

c# - C#子字符串引发异常

c - 使用链表与大数组进行搜索

c# - 从 C# 线程调用非托管代码

c - 读取 FIFO,资源暂时不可用

c# - 如何在 SignalR 中从服务器发送定期消息

c# - 使用对象类型在模块之间传递信息

c# - 如何在 C# .NET 4.5 中使用 GroupPrincipal 创建 AD 组?

c# - 我可以从返回类型的类型中提取泛型类型吗?