Here the code on this concern:
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);
}
But, then I run that app it gives slightly different results:
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
Seems like it takes some time to bootstrap the threads, creating them and then Parallel execution time will arranged correctly.
So the question is why it takes more than 2 secs to handle all processing and how can I avoid it by bootstrap the threads before processing?
Update:
This loop is placed in separate background thread.
Yes, threadpool needs to grow number of threads based on load (unrelated to Parallel.ForEach).
Check Parallel.ForEach not spinning up new threads and Parallel.Foreach spawning way too many threads for some background.