0

WCFサービスがあり、複数のクライアントがそれに接続してイベントをサブスクライブしています。

また、ホストされたWCFサービスとともにバックグラウンドで実行され、操作を実行してアイテムを「Producer\ConsumerQueue」にプッシュするワーカースレッドもあります。

キューにアイテムがある場合にWCFサービスを動作させて、キューからアイテムを抽出して分析し、サブスクライブしているすべてのクライアントにメッセージを公開するにはどうすればよいですか?

WCFサービスは、接続されたクライアントから呼び出された操作に反応することを知っていますが、アイテムがこのキューにキューイングされたときに応答させるにはどうすればよいですか?

可能であれば、簡単なコードサンプルで答えてくれる人をいただければ幸いです。

4

2 に答える 2

1

最も簡単な方法として、wcfサービスがキューからのエンキューイベントをサブスクライブし、イベントが発生したらメッセージの処理を開始できるイベントが必要です。非ジェネリックキューの場合、EnqueueメソッドをオーバーライドしてOnChangedイベントを発生させることができます。

public override void Enqueue(object obj)
{
    base.Enqueue(obj);
    OnChanged(EventArgs.Empty);
}

ジェネリックキューからイベントを発生させる方法の詳細はこちら

//from worker thread
queue.Enqueue(some_object);

//in wcf you could probably do something like this
queue.OnChanged +=  ProcessMessage;

public void ProcessMessage(object sender, EventArgs e)
{
     lock(lock_object)
     {
          var some_object = queue.Dequeue;
          //processing logic and broadcasting to client
     }
}
于 2012-07-01T17:51:19.587 に答える
0

これが私の考えです。これは最善ではないかもしれませんが、それは始まりです。シナリオに必要な機能を実現するには、2つのWCFサービスを作成します。最初のサービスはQueueServiceと呼ばれ、基本的にキューを保持および管理します。2番目のサービスはそれをPublisherServiceと呼びます。これは、新しいアイテムがキューに追加/削除されたときにQeueServiceによって通知されることを目的としています。これを実現するには、デュプレックスチャネルを使用する必要があります(パブリッシュサブスクライブパターンhttp://msdn.microsoft.com/en-us/library/ms752254.aspxを適用します))、PublisherServiceはQueueServiceのクライアントとして機能します。PublisherServiceを使用するクライアントについて...これまでどのような手法を使用したかわかりません。PublisherServiceからデータを取得するために、デュプレックスチャネルまたは連続ストリーミングを使用していますか?(http://blog.john-thiriet.com/en/2011/08/using-reactive-extensions-for-a-push-based-client-server-communication-with-silverlight-and-wcf/)

于 2012-07-01T18:30:07.400 に答える