1

さまざまなスレッドを使用して多くの並列作業を行うプログラムを C# で作成しました。約 300 スレッドに達すると、プログラムの GUI が遅くなり始め、スレッドの実行も大幅に遅くなります。スレッドは、別のマシンで実行されている mySQL データベースからデータを読み書きしています。

面白いことに、同じマシン上の 2 つのプロセス間で作業を分割すると、すべてが完璧に実行されます。.net フレームワークまたは Windows のプロセスごとにスレッド制限はありますか? または、なぜこの動作が発生するのですか? ネットワーク関連の問題でしょうか?Windows 7 Ultimate を実行していますが、VS2010 と VS 2012 の両方を同じ動作で試しました。

4

5 に答える 5

4

プロセッサ時間を割り当てる方法は、オペレーティングシステムがすべてのプロセスにプロセッサ時間を与え、次にすべてのプロセスがすべてのスレッドに時間を与えるというものです。したがって、2つのプロセスのプロセッサ時間は2倍になります。そのため、プログラムを2つのプロセスに分割すると、より高速に動作します。GUIをよりスムーズに実行したい場合は、そのスレッドの優先度を高く設定するだけです。このようにして、GUIスレッドは他のスレッドよりも多くのプロセッサ時間を取得しますが、他のスレッドの速度を著しく低下させるほどではありません。

于 2012-09-27T12:28:55.170 に答える
4

300 スレッドはばかげています。

スレッド数は、システムがサポートするコア数 (2..8) および/または最大同時接続数 (TCP では 4 つだけ) の範囲内である必要があります。

それを超えると、スレッドごとに 1 MB のメモリが浪費されるだけです。32 ビット システムでは、300 MB がすでに使用可能なメモリ領域を大量に消費しています。そして、各スレッドにはいくつかのバッファーが接続されていると思います。

2 つの別々のプロセスが 1 よりも優れたパフォーマンスを発揮する場合、おそらくコンテキストの切り替えではなく、メモリ使用量または接続制限のいずれかが妨げになっています。

于 2012-09-27T12:39:52.740 に答える
1

ThreadPoolを使用します。存在するスレッドの数を調整することにより、システムに基づいて最適な数のスレッドを自動的に割り当てる必要があります。一度に許容されるスレッドの最大数を設定することもできます。

また、for-loop、foreach-loop、または linq ステートメント内からタスクを並列化するためにスレッドを割り当てている場合は、Parallel ClassまたはPLINQを確認する必要があります。

于 2012-09-27T12:38:03.883 に答える
0

この質問に対する受け入れられた答えは、おそらく何が起こっているのかを説明するでしょうが、多くの人にとって、通常のアプリケーションでは 300 スレッドが良い考えのように思えます。

于 2012-09-27T12:31:20.710 に答える
0

最初に、アプリケーションに 300 のスレッドがある場合は、おそらくプログラムの設計を再考する必要があります。

GUI スレッドの優先順位を設定すると、GUI のパフォーマンスが向上する場合があります。しかし、非常に多くのスレッドを実行すると、OS はプログラム スタックにスペースを割り当てる必要があります。そして、スタックはメモリの連続セグメントです。そのため、新しいスレッドを作成するたびに、スタックに割り当てられたメモリ領域が新しいスレッドを保持できない場合があります。そして、OS はメモリ内により大きな連続スペースを割り当て、すべてのデータを古いスタックから新しいスタックにコピーする必要があります。したがって、明らかにこれにより、プログラムのパフォーマンスが低下する可能性があります。

于 2012-09-27T12:40:16.540 に答える