2

TCP/IP を介した JSON RPC 接続の実装に取り​​組んでいますが、根本的な問題が 1 つあります。現在、私は同期アプローチを使用していますが、これはうまく機能します。

私は送ることができます

{"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();

過度に複雑にすることなくこれを実装するクリーンな方法はありますか? あらゆる/すべてのアドバイスをいただければ幸いです。

4

1 に答える 1

2

ここにすべての読みがあります。あなたがそれに参加したいのであれば、それはすべて価値があります。 http://msdn.microsoft.com/en-us/library/ms228969.aspx

要約のために..

基本的に、発生する必要があるのは、IAsyncResultを実装するオブジェクトを作成する必要があることです。これにより、非同期操作に関する状態と、それが完了したときのコールバックが保存されます。

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

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

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

私と非同期httpハンドラーを使用してjson-rpcを実行する方法の実用的な例が必要な場合は、Processが呼び出されているhttp://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#74311も参照してください。非同期オブジェクトがセットアップされていますhttp://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#61720

お役に立てば幸いです。

于 2012-05-03T23:37:18.890 に答える