2011-09-12 4 views
0

私はC#プログラミングを見て、その言語をかなりスクラブしています。私は一般的にオブジェクト指向プログラミングをよく理解していると思っていますが、複数のスレッドを実行することは、高いレベルでは意味しますが、実際の実装では私はスクラブと言います。C#でクラスの "スプール"サービスを作成する方法

私が探しているのは、多くのスレッドを実行し、互いに独立して相互作用し、それぞれが独自のタスクを提供し、他のスレッドを呼び出すツールを作成することです。

通信を確実にするための戦略(異なるスレッドから複数の更新が同時に発生することなく何も失うことなく)は、各クラスで外部と呼ばれるタスクを作成し、特定のスレッドにタスクを追加するか、これらのために。私はこれをクラスまたは外部に配置し、クラス自体が新しいタスクのためにスプールを呼び出し、スプールを追跡する必要があるかどうかはわかりません。ここで私は特に、空のスプールがタスクを取得した場合(クラスが新しいものが到着したときにタスクが呼び出されるようにするためにタスクをプールに登録できるようにするリスナーのアプローチ)、または "次のタスクがスケジュールされていない」アプローチ

実際のクラスでこれを作成するか、外部から作成するとよいでしょうか? 「ビジー待機チェック」は新しいジョブの追加と実際のスプールでのジョブの削除を可能にするため、シグニチャにはジョブの追加と削除の両方が必要ですが、Gotoスリープも必要です重要な領域が入力された場合に何をすべきかのスプールに対する高い要求を突然追加します。これにより、ブロックが発生し、他のブロックが発生し、予期しないデッドロックが発生する可能性があります。

+0

すごい私は、これは非常にオープンエンドの問題だと思います。この種のシステム(主にエージェントと呼ばれます)については多くのことが書かれています。エージェントベースのシステムを検索するだけです。 – Carsten

+0

うんざりして深い端にまっすぐ落としてしまった。提案していただきありがとうございます。私はそれを徹底的に調べます。私が目指しているのは、このための良いアプローチで私を助けることができる "パターン"です。適切なパターンが見つかったら、実際の実装を把握することは、半分の楽しみになるでしょう。 – Taoh

+1

私はあなたの質問すべてを理解しているかどうかはわかりませんが、[アクティブオブジェクト設計パターン](http://en.wikipedia.org/wiki/Active_object)はここで役に立つかもしれません。 – dtb

答えて

1

このようなモデルは、さまざまなシステムでよく使用されます。私はエージェントのクラス、例えば 'AgentClass'とリクエストのためのクラスを 'RequestClass'と定義します。エージェントには、2つの抽象メソッド、 'submit(RequestClass * message)'と 'signal()'があります。通常、エージェント内のスレッドはプロデューサ - コンシューマキューを構築し、RequestClassインスタンスを待機します。submit()メソッドは、渡されたRequestClassインスタンスをキューにキューイングします。 RequestClassには、通常、要求を実行するために必要なすべてのデータと「送信者」エージェントインスタンスとともに、エージェントに何が必要かを伝える「コマンド」列挙が含まれています。エージェントは要求を受け取ると、要求を行うために正しい関数を呼び出すように列挙をオンに切り替えます。エージェントは、RequestClass内のデータに対してのみ機能します。結果、エラーメッセージなどは、RequestClassのデータメンバーに配置されます。エージェントがリクエストを実行すると(または失敗したエラーデータが生成されたとき)、リクエストを送信者に提出する(つまりリクエストが非同期に実行された)か、senders signal()関数をコールするか、 whchは、送信者が待機していたイベントを通知します(つまり、要求は同期的に実行されました)。

私は通常、スタートアップ時に一定数のRequestClassインスタンスを構築し、それらをグローバル 'プール' P-Cキューに格納します。任意のエージェント/スレッド/要求を送信する必要があるものは、RequestClassインスタンスをデキューし、データを入力し、それをエージェントに提出し、非同期的にまたは同期的に要求の実行を待つことができます。終了すると、RequestClassがプールに返されます。私は継続的なmalloc/free/new/disposeを避けるため、デバッグを容易にするためにこれを行います(タイマーを使ってプールレベルをステータスバーにダンプするので、リクエストがリークしたり解放された場合に常に気づきます。アプリケーションクローズ時の明示的なスレッド終了の必要性(複数のスレッドがアプリケーションフォームなどのデータ領域を読み書きするだけであれば、アプリケーションは簡単に終了し、OSはすべてのスレッドを処理できます) 'アプリケーション終了時にスレッドをきれいにシャットダウンする' - 私は心配しない!)。

このようなメッセージパッシングデザインは、唯一のロック、(もしあれば)以来、デッドロックに非常に耐性があるあなたは十分に懸命にしようとした場合、あなたは確かにそれを達成することができますが、PCのキューにある:)

はこれですあなたが必要と思われるシステムの種類、またはそれを間違っているか?

RGDS、 マーティン

関連する問題