2012-04-28 10 views
2

TCP/IP経由でJSON RPC接続を実装しようとしています。現在、同期アプローチを使用していますが、うまくいきます。C#でTCP/IP JSONRPC接続を実装する - デザインアドバイスが必要

私は

{"id":1,"jsonrpc":"2.0","method":"Input.Home"} 

を送信し、これは問題なく動作します

{"id":1,"jsonrpc":"2.0","result":true} 

を受け取ることができます。この問題は、通知を受け取ったときに発生します。これらは、いつでも予期せず到着する可能性があります。私はXBMC JSON RPC APIと対話しています。 XBMCによって通知が送信された場合、私は一度に複数のJSONリクエストを受け取ります。例えば。

{"jsonrpc":"2.0","method":"GUI.OnScreensaverActivated","params":{"data":null,"sender":"xbmc"}}{"jsonrpc":"2.0","method":"GUI.OnScreensaverDeactivated","params":{"data":null,"sender":"xbmc"}} 

これはJSON.NETでクラッシュを引き起こします。私の最初の本能は、これらの通知を非同期的に受け取る必要があるため、次のメソッドが呼び出されるまで待つ必要がないからです。しかし、これは私がもはや同期呼び出しを利用することができないため、上記の簡単な例を複雑にしています。すなわち

SendJson(json); 
result = ReceiveJson(); 

これを複雑にすることなくこれを実装する明確な方法はありますか?すべて/すべてのアドバイスをいただければ幸いです。

答えて

2

ここにはすべての読みがあります。あなたがそれに乗りたいならば、それはすべて価値がある。概要については http://msdn.microsoft.com/en-us/library/ms228969.aspx

しかし..起こるに必要なもの基本的に

は、あなたがたIAsyncResultを実装するオブジェクトを作成する必要があります。これには、非同期操作に関する状態と、完了したときのコールバックが格納されます。

IAsyncResultオブジェクトを入力として取得できるメソッドを作成し、メソッドが返される前にIAsyncResultオブジェクトの.SetCompleted()を呼び出す必要があります。このメソッドの内部では、通常の作業を行います。

次に、IAsyncResultオブジェクトのインスタンスを作成し(データとコールバックを設定して)、Task.Factory.StartNew([YourNewMethod]、[YourInstanceOf IAsyncResult])を呼び出します。

これは何が起こる必要があるのコアです。コールバックを設定して例外を処理するようにしてください。

あなたは、私とJSON-RPCを行うには非同期HTTPハンドラを使用するには、またhttp://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#74311を見てみましょうプロセスが呼ばれている場所と非同期オブジェクトがそのセットアップhttp://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#61720

希望される方法の実施例をしたい場合助けてください。

+0

これはまさに私が求めていたものです。ありがとう! – mouser58907

関連する問題