0

C#プログラミングの研究を始めたばかりです。最近、私は.NET4.0で指定された計算のパフォーマンステストを研究しています。システムは多くのデータを読み取ってコピーし、私自身の機能によって計算されます。

マルチスレッドシステムを使用して、300を超えるデータセットに対してこれを実行しようとします。すべてのスレッドはデータの受信から開始されるため、この部分ではEventHandlerを使用します。

スレッドの作成方法がわかりません。確かに、私はそれらをリストとして作成し、次のように関数を1つずつ実行できます。

Function la = new Function();
List<Thread> threadSet = new List<Thread>();
for (int i = 0; i < 300; i++)
  threadSet.Add(new Thread(new ThreadStart(la.doWork)));
for (int i = 0; i < 300; i++)
  threadSet[i].Start();

それとももっと良い方法はありますか?スレッドプールの問題を見ましたが、それとどのように違うのかわかりません。

そして、イベントインクルードスレッドの構築はスレッドインクルードイベントハンドラーよりも優れているのだろうか。

英語は私の母国語ではないので、質問の表現が間違っていたのかもしれません。

ありがとうございました。教えて下さい!

4

2 に答える 2

0

.Net 4.0を使用すると、まったく同じことを行う最も簡単な方法は次のようになります。

Parallel.For(0,300, _ => la.doWork() );
// or with plinq
Enumerable.Range(1,300).AsParallel().ForAll(_ => la.doWork() );

これらのソリューションの利点は、スレッドの作成と管理を処理したり、コードを乱雑にしたりする必要がないことです。これは必ずしもすべての作業項目のスレッドを作成するわけではないことに注意してください。

現在、このコードは、la.dowork()がCPUのみのタスクである場合にのみ最適です。これに、I / O(ファイルまたはネットワークからの読み取り)が含まれる場合、時間のかなりの部分がスレッドはデータの待機に浪費されます。

あなたがしていること(データをどこで読み、それを使って何をしているのか)についてもう少し詳しく教えてください。

于 2011-08-17T03:38:36.443 に答える
0

非常に多くのスレッドを使用しても、常にパフォーマンスが向上するとは限りません。タスク (I/O バウンドか CPU バウンドか) とタスクの数によって異なります。

.Net 4.0 には PLinq ライブラリがあります。ハードウェアに合わせて最適に実行しようとするため、環境に必要なパラリズムの量を自動的に選択します。この記事を読んでください。http://msdn.microsoft.com/en-us/magazine/cc163329.aspx

于 2011-07-28T03:12:44.360 に答える