2012-04-02 13 views
2

に新しいスレッドを生成するために失敗しました。実際のループは、ネットワークレスポンス(基本的にはネットワークスキャナ)の待ち時間はあまりありませんし、Visual Studio 2010でうまく動作します。アプリは何百ものスレッドに広がります。十分に長く走ってください。私は、「ClickOnceの」アプリケーションとしてそれを「公開」がオンのとき.NET 4.0パラレルforeachループは、私はそれの中心で並列foreachループを持っている小さなWPF C#アプリケーションを持っている「生産」アプリケーション

ParallelOptions parallelOptions = new ParallelOptions(); 
     parallelOptions.MaxDegreeOfParallelism = 4; // I've tried changing this all the way up to the maximum 

     ThreadPool.SetMinThreads(100, 100); 

     Parallel.ForEach<string>(scanAddresses, parallelOptions, (toscan,state) => 
{ 
    doMyScan(toscan); 
} 

アプリケーションが一部に、まったく確かにもマルチスレッド、またはしない、しかし:

ここでは、コードのコアビットですマシン - スレッドカウントは、どれくらいの時間が経過しても16スレッドを超えることはありません。私は、共通の分母が何であるかを正確に把握することはできません - 私はOS(例えばXP対Win7)、プロセッサ、メモリ、それが32ビットか64ビットかどうかを排除しました。私は本番サーバからの私の開発VMにそれをダウンロードするとき、アプリケーションでも誤動作 - それは上に開発されたとして正確同じボックスに「ライブ」の実行時にVS2010の下で飛んで同じアプリとコードがクロールします。しかし、他のマシンでは、XPインストールの中でも非常に限られたものであっても、多くのスレッドを生成するように設計されています。

コアコードがサウンドであることは確かです。結局のところ、いくつかのマシンでうまく動作していて、コンソールアプリケーションとして動作する同じコードのバリエーションがあります。つまり、展開プロセスが壊れているそれ。誰もがこのトラブルシューティングを開始する方法を提案することはできますか?

+1

コードを提供します。通常は、人々のトラブルシューティングに役立ちます。撮影した – Quintium

+0

ポイントは、コードが – KenD

答えて

0

以下のコメントへの感謝が、彼らは面白い読書をしたものの、結局、(並列性とは何の関係もしないことが判明まあ... - 私は間違いなく自分自身を何の専門家だ、私はちょうどで耕さと動作するように見えました;))。

問題は、半開きTCP接続の制限に達しています。私はこの制限がXP上に存在することを知っていましたが、明らかにWin7で削除されたにもかかわらず、実際にレジストリキー(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ EnableConnectionRateLimiting)が必要です。見知らぬ人はまだ半開きの制限はVSの下で実行されているアプリには当てはまりませんでした。実際のスタンドアロンアプリケーションとして実行されていたときの接続は限られていました。すべての非常に奇妙な、しかし問題はとにかく解決 - すべてのフィードバックのおかげで!

0

私は、Parallelライブラリが、あなたの基盤となるハードウェア(プロセッサとコア)を見て、何らかの並列性があると判断したと感じています...おそらく、誤動作しているマシンにはシングルプロセッサ、シングルコア?

+0

を追加しました。しかし展開したコードは、VS2010で実行するときに完全にそれを実行する同じマシン:( – KenD

4

TPLは、最大数のスレッドを生成することを目的としていません。これは最適なスレッド数を生成することを目的としており、これはマシン上のコア数と現在の負荷に依存します。現在のコアが飽和している場合は、プログラムのパフォーマンスが低下するだけなので、追加のスレッドを作成する必要はありません。 Parallel Foreachを使用してどのような環境でも何千ものスレッドを生成する方法がわかりません。

またTPLはCPUに負荷をかけ仕事のためではなく待機しているために使用すべきです。

+1

に誤動作「またTPLは、CPU集中的な作業のためにしていない待機中に使用する必要があります。」あなたは起草気にしませんか?ので、 –

+0

TPLは、ワークスティールのような技術を使ってCPUの作業を最適化することを目指していますが、CPUキャッシュの無効化などの問題を軽減するために注意を払っています。それを使用することから。その代わりに、非同期呼び出しとコールバックを使用して、スレッドと比較してCPU負荷とメモリ使用量を減らす必要があります。 – Stilgar

+0

TPLではなく、タスクを公開することで、IOなどのより良い非同期サポートを有効にできますか? I/Oに焦点が当てられているとは言いませんが、私はTPLが両方のフォームを同等にサポートしていることを示唆しています。私は、Parallel.ForEachがOPの質問に行く正しい方法だと提案していません。 –

関連する問題