2011-04-27 9 views
1

私は前の質問を言い換えるとHow to create Singleton with async method?いつも別のスレッドで動作するシングルトンを作成するには?

メッセージングアプリケーション(icqのような)を想像してみてください。これは常にサーバに接続し、メッセージを投稿する必要があります。

私はクラスConnectionを含める必要があります。これはシングルトンでなければなりません。なぜなら内部に "ソケット"が含まれており、そのソケットは完全なアプリケーションの存続期間中存続するからです。

その後、私はpostMessageは時間の大幅なammountを取ることができますので、非同期メソッドConnection.postMessage

を実装する:neccesary

場合

  • postMessage
  • postMessage asyncを指定しなければならないが、メッセージをキューに入れる必要があります私のアプリケーションの投稿は1秒間に数十件のメッセージになるので、アプリではありませんそれぞれのpostMessage呼び出しのための新しいスレッドを作成するためにropiate。

    メッセージの投稿用にちょうど1つの余分なスレッドを作成する必要がありますが、どこにどのように配置するのか分かりません。

    UPD:好例http://msdn.microsoft.com/en-us/library/yy12yx1f(v=vs.80).aspx

+2

前のように、シングルトンとは何の関係もありません。メッセージキューを作成する方法を知りたい。あなたはそれをシングルトンにしているだけです。 –

答えて

3

いいえ、のpostMessage(自体)が非同期であってはなりません。

それ

  • はスレッドセーフ
  • すべき処理スレッドがメッセージ(ConcurrentQueue)
  • キューを実行しているリターン

と処理スレッドが

なければならないことを確認
  • キュー
  • プロセスを待つメッセージ
  • 多分あなたが持っているもののアイドルXXミリ秒

ため自体を終了は、1つの消費者と複数の生産者との古典的なプロデューサ/コンシューマ状況です。

PostMessageは、すべてのプロデューサのエントリポイントです。

+0

が同意すると、このようなサウンドは私のアプリケーションでうまくいくはずです。このパターンのC#実装のためにGoogleに試行します。しかし、私は質問があると思う、どのように "処理スレッドが実行されていることを確認する"。スレッドの作成と管理方法 – javapowered

+0

@javapowered: 'var t = new Thread(...);'と 'if(t.IsAlive)'です。 –

1

JP、

あなたがここに古典的なプロデューサ/コンシューマの問題を見ている...初期化中ConnectionMessageQueueそれ自身のバックグラウンドスレッドでSenderを開始を作成する必要があります。

その後、接続先postsだけがキューにメッセージを送信し、準備ができたら送信者に転送します。

トリッキービットは最大キューサイズを管理しています...プロデューサがコンシューマよりも一貫してコンシューマを超えた場合、キューは管理不能なサイズに拡大する可能性があります。最も簡単な方法は、キューがいっぱいになるまでプロデューサスレッドをブロックすることです。これは、バックオフ-ARQを用いて行うことができる。つまり:while(queue.isFull) sleep(100, "milliseconds"); queue.add(message); 100%の送信(チャットアプリケーションのような)を必要としない場合は、単純にMessageQueueFullExceptionをスローすることができます。貧弱なクライアントはそれを乗り越えなければなりません。ちょうどそれらが再送信を許可します後で...ユーザがあなたのために再試行を管理できるようにする。

それは私がとにかくそれに取り組む方法です。他の提案がどのように消されているのかを知りたい。

希望はあなたのためにうまくいきます。乾杯。キース。

+1

これは、**プロデューサスレッドをブロックしていない**です。それは待っています。 –

+0

ええと... 1/10秒で十分速く、忙しくはありませんが、忙しいです。プロデューサースレッドをブロックしていないのですが...。プロデューサーはキューが満杯にならなくなるまで何もしません...私はそれを十分に便秘と呼んでいます。 – corlettk

+0

私は「最も簡単な方法はプロデューサースレッドをブロックすることです」と言っています。あなたは "決して使用しないでください"キャンプから来た、あなたは...一口。私はちょうど動作するソフトウェアを書いています。 – corlettk

関連する問題