在C#中实现TCP / IP JSONRPC连接 - 需要设计建议

时间:2012-04-28 01:43:53

标签: c# tcp json-rpc

我正在通过TCP / IP实现JSON RPC连接,我有一个基本问题。目前我正在使用同步方法,效果很好。

我可以发送

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

并收到

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

这没有问题。当我收到通知时会出现问题。这些可以在任何时候以不可预测的方式到达。我正在与XBMC JSON RPC API进行交互。如果XBMC发送了通知,我会立即收到多个JSON请求。 E.g。

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

有没有一种干净的方法来实现它而不会使它复杂化?任何/所有建议都表示赞赏。

1 个答案:

答案 0 :(得分: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 }

希望有所帮助。