2012-04-27 9 views
3

をとります。Parallel.ForEachはここで、この懸念のコードが予想以上に時間

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秒以上かかるのはなぜですか、処理する前にスレッドをブートストラップすることでどのように回避できますか?

更新:

このループは、別個のバックグラウンドスレッドに配置されます。

+3

「ホスト」にはいくつの要素がありますか?いくつのコアがありますか?そして、スレッドを "ブレイクラップ"することはどういう意味ですか? – Cameron

+0

ホストは22個の要素で満たされます。 2つのコア。 「ブートストラップ」とは、使用されているスレッドプール内にスレッドを作成することを意味します。私はそれについてあまり明確ではない。 – kseen

答えて

1

はい、スレッドプールは、負荷に基づいてスレッド数を増やす必要があります(Parallel.ForEachには関係ありません)。

背景については、Parallel.ForEach not spinning up new threadsParallel.Foreach spawning way too many threadsを確認してください。

+0

どうすればこのループを常にスレッドの具体的なカウントを使用することができますか? – kseen

+0

私はそうは思わない、あなたは最大を制限することができますが、そうでなければForEachとThreadPoolはあなたの負荷に合わせようとします。 –

+0

私はそれが私がしたいと思うように働くために別の方法を行くべきですか? :) – kseen

1

あなたが実際にここを参照してください、あなたのパラレルオプションを通過していない:

ParallelOptions options = new ParallelOptions(); 
options.MaxDegreeOfParallelism = -1;     
Parallel.ForEach(hosts, options, item => // note options passed through here 
     // etc 

、これは十分に作成されていない場合は、スレッドプールを増やすことができます

System.Threading.ThreadPool.SetMinThreads System.Threading.ThreadPool.SetMaxThreads

しかし、あなたが改善を得ることを知っていない限り、私はこれに触れません。あなたのタスクコードでPingを実行しているので、これはそれぞれの実行の間のバラバラ性を追加するものかもしれません。

+0

同じ結果が得られます。最大スレッドは大きな値に設定されているため、問題はありません。 – kseen

関連する問題