2011-12-16 13 views
5

質問の文言は、必ずしも問題の正義を行いません...WCFサービスと別のスレッド間で通信する最善の方法は何ですか?

  • 私はそれがバックグラウンド機能を実行しながら、それをサポートするために、ローカルボックスとバックグラウンドのWindowsサービスの上に座って、クライアントのUIを持っています。
  • クライアントUIはプレゼンテーションレイヤーにすぎず、Windowsサービスはすべてのヒットアクションを実行します。そのため、2つの間の通信が必要です。 Googleでしばらく時間を費やしてベストプラクティスを読んだ後、WCFと名前付きパイプを使用してサービスレイヤを作成することにしました。
  • クライアントUIはWCFクライアントであり、WindowsサービスはクライアントをサポートするWCFホスト(ローカルでのみホスト)として機能します。

これは正しく動作します。クライアントUIは、データをWCFホストに渡すことができます。しかし、私の質問は、私はそのデータをどのように役立つのでしょうか? 私はWindowsサービス/ WCFホスト上で実行されているいくつかのエンジンを持っていますが、WCFホストはバックグラウンドエンジンの存在を完全に認識していません。これらのエンジンと対話できるようにするには、クライアントの通信要求が必要です。

誰かがWCFホストと実行中のスレッド間の通信を容易にする方法について、良い設計パターンや方法論を知っていますか?

+0

メッセージキュータイプのパターンについて話していますか?また、タスクを非同期で待ち行列に入れ、完了時にクライアントに報告する必要がありますか? – slugster

答えて

3

サービススレッド/プロセスとWCFサービスの間でデータを交換するために使用できる静的なプロパティまたはメソッドを使用することをお勧めします。

また、これにアプローチする方法は、クライアントまたはwcfサービスが応答するサービスの要求をキューに入れ、利用可能なときにサービスが応答するデータベースを更新するデータベースを使用する方法ですそれらの要求。その後、クライアントは定期的に(WCFを介して)データベースをポーリングし、未処理の要求の結果を取得します。

例えば、クライアントがレポートを生成する必要がある場合、WCFを介して要求を開始し、WCFはデータベースにレポート生成要求を作成します。

レポートの生成を担当するサービスが定期的にこのテーブルをポーリングし、新しいエントリを検出すると、レポートを生成する新しいスレッド/プロセスを起動します。

レポートが完了すると(正常または失敗のいずれか)、サービスはデータベーステーブルを結果で更新します。

一方、依頼されたレポートがまだ完了していない場合、クライアントは定期的にWCFサービスに問い合わせます。 WCFサービスは、完了した要求はまだポーリングしていますが、まだクライアントに配信されていない要求を収集し、クライアントから情報を収集してクライアントに返します。私たちは、ワークロードの増加に伴い、複数の物理/仮想マシン間でこれらの要求を処理するサービスの数を拡張することができます)

1:

このメカニズムは、私たちはいくつかのことをすることができます。

2)特定のサービスで多数のクライアントをサポートできます。

3)WCFインターフェイスを使用して、サポート対象のクライアントプラットフォーム(Web、Win、タブレット、電話など)にこのサポートを拡張できます。私たちは、あなたがこのパターンを実装するために必要があることを意味しないデータベースを使用することを選択

からといっ:

は言及を忘れていました。同じ機能を簡単に実装するには、データベースを使用するのとほぼ同じ方法でWCFサービスとワーカーサービスにアクセスする静的な要求コレクションを作成します。

スレッド間の衝突やデッドロックを避けるために、静的プロパティのロックを適切に取得して解放するだけで十分注意する必要があります。

+0

私はあなたがこれで死んでいると思います。私はメッセージキューのフローとしてデータベーステーブルを使用することを考えていましたが、データベースレコードに関するオーバーヘッドが少し気になりました(N個のクライアントがサーバと通信する方法を見ています)。あなたの "忘れた言及"は、私が考えている最良の計画です。なぜなら、メッセージをエンキューするために静的なキュー構造を使うことができるからです。このようにして、適切なスレッドロックプロシージャを使用すると、静的メッセージにアクセスして必要に応じてデキューできます。どうもありがとうございます。 – jermny

関連する問題