2011-11-04 22 views
10

私のプロジェクトのイベント用にRxを使用しています。よくやって。コード、パフォーマンスの優位性を管理し、実行して解釈する方がはるかに優れています。非同期パターン(queue.BeginReceive、queue.EndReceive)を使用してMSMQメッセージを受信するためのリアクティブエクステンション(Rx)の使用

最近、私はすべての着信データを(ソケット操作から)待ち行列に入れる(待ち行列のために決定されたMSMQ実装を使用して)必要がある場合に、プロジェクトのプロセスフローを変更する必要があります。

MSMQはキューからメッセージをデキューするための非同期呼び出しを提供しますが(wierdパターン) 私は今この目的のためにRxを使用することに苦労していますが、そうすることができます。

質問:非同期パターンを使用するキューからのメッセージ受信用にRxを実装するためのクリーンなコード例があります。

私は事前にこの

var data = Observable.FromAsyncPattern<byte[]>(
         this.receiverSocket.BeginReceive, 
         this.receiverSocket.EndReceive(some parameters); 

のおかげのようなものに類似したMSMQのための非同期オペレータの実装を必要とします。 * Rxおよび.NETへ歓声 *

+0

あなたはパラメータを持つ 'EndReceive'を持つクラスに私を指すことができますか?私はそれを見つけることができません... – Enigmativity

+0

私はあなたが尋ねているものは確信していませんが、私は理解したものの答えです。私は "System.Messaging.Message"オブジェクトを返すBeginReceiveとEndReceiveのRx実装(FromAsyncPattern)が必要です。非同期メソッドは、System.Messaging.MessageQueueオブジェクトメソッド用です。あなたは今、より良いアイデアを得ることを願っています。私は満足していて、Rxの質問に関してはあなたが超高速に返信することを確信していました:D – Jsinh

+0

'MessageQueue'クラスの' EndReceive'メソッドのどれも 'IAsyncResult'以外のパラメータを持っていません。あなたの 'receiverSocket'はどんなタイプですか? – Enigmativity

答えて

4

それはのような単純なものになります。

var queue = new System.Messaging.MessageQueue("test"); 
var fun = Observable.FromAsyncPattern((cb, obj) => queue.BeginReceive(TimeSpan.FromMinutes(10),obj,cb), a => queue.EndReceive(a)); 
var obs = fun(); 
+0

あなたは正しいと思います。全体の "EndReceiveのパラメータ"は完全に私を投げた! – Enigmativity

+1

はい。このコードは完全に機能します。しかし、問題はタイムアウトである。ここでtime:caseが10分のとき、メッセージがキューにない場合、MessageQueueExceptionがスローされます。 2番目の問題は、var obs = fun();サブスクライブは、以前のリクエストの受信に同期して再帰的にする方法を一度しかコールしません。 – Jsinh

+1

Google社への注意 - 当時の素晴らしい答えでも、FromAsyncPatternは現在廃止されています**。 – MickyD