2011-12-04 5 views
0

私は、ユーザーが定義した数のタスク、たとえば100を実行するプログラムを作成しています。このプログラムのスレッドをC#でどのように設計するのですか?

各タスクは、サーバーに出て、応答を取得し、別のサーバーに電話をかけ、応答を使用して、前のサーバーへの別の呼び出しを行います。

私はアプリケーションをマルチスレッドにしたいので、ユーザーがボタンを押すと、例えば10スレッドが起動され、それらが起動します。

タスクが完了すると、タスクを完了したスレッドは、スレッドが終了し、タスクが完了したことをユーザーに警告する何も起こらないまで、リストから別のスレッドを取得します。

以前私が似たようなことを試みたとき、私は基本的にN秒間に10個のスレッドを立ち上げ、以前のものはそれまでに祈っていました。

私の質問は、いくつかのスレッドを作り、何とかそれらを保存し、完了したらタスクを追加することです。 私は、リストへのスレッド参照を追加して、どのスレッドが眠っているかを確認して何かを強制するように指示しましたが、どうしたらよいかわかりませんが、ほとんどの場合、この問題に近づく。

ありがとうございます!

+0

この質問は、多くのスレッドを開始するとよりうまくいくという概念に偏っています。これは非常にありそうもなく、スレッドを使用すると、多くのコアを持つマシンがある場合にのみうまく動作します。あなたがサーバと話すときには、動作することはほとんどありません。オーバーヘッドは、トークを、例えば、TCPチャネルに絞ろうとする話です。それらのうちの1つだけ。あるいは、サーバーは、実際には複数の保留中の要求で適切にスケーリングすることができます。これは最終的に "あなたが書かなかったコード"に行きます。サーバーの男に話してください。そして、いいえ、彼がそれについて喜んでいるとは思わないでください。 –

+0

@ HansPassant - OPは、各タスクが同じサーバーペアを使用するかどうかを明確にしません。そうでない場合は、サーバーごとに複数の接続が発生しないことがあります。任意の任意の解決策が利用できない場合や優先されない場合は、特に通信プロファイルが継続的な接続/切断である場合(たとえ1つのコアであってもDNSルックアップをブロックし、 way-handshake-connect、一部のデータ転送、4-way-handshake-disconnectのブロック)。 –

答えて

4

まず、本当にネットでスレッディングを理解していることを確認してください。私はこれが非常に良いリソースであることを発見しましたThreading in C#。テーブルに新しいまた

は、あなたが(Parallel.ForEach)あなたの状況が簡単になります。このhere

データ並列の詳細を読むことができ、.NET 4にデータの並列ですが、私は本当にあなたがヒット示唆します本を学び、基礎を学ぶ。しかし、もし無知が至福であれば、MSとデータ並列性はあなたのためです。

.net 4、したがってデータ並列性にアクセスできない場合は、タスクキュー(Queue(Of T) Class)、スレッドに安全にアクセスするためのロック(Locking)、バックグラウンドスレッドThreadPool Class)、および何らかの形式のシグナリング(Signaling with Wait and Pulse)が含まれます。

ボーナス。特定の時間に動作するスレッドを制限/制御するには、Semaphoreもチェックしてください。

これが役に立ちます。

+0

+1する必要があります。キューイングの作業は、スレッドを管理しようとするよりはるかに簡単です。起動時に作成されたばかりで、ブロッキングキューをハングアウトするのが最適です。複数のDNSルックアップと複数のTCP接続の場合、かなりの量のブロッキングが予想されます。つまり、プールを大きく、またはよりリアルタイムに構成可能にします。 –

+0

メイト、セマフォはまさに私が必要としていたものです。ありがとう! –

1

あなたが求めているように聞こえるのは、Task Parallel Libraryです。基本的に、スレッドを自分で管理することなく、タスクを同時に実行するのに役立ちます。ただし、マルチスレッド化されたコードの基本を理解しておく必要があるため、並行してタスクを実行できるようにプログラムを構成することができます。

関連する問題