2012-04-28 63 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])。

這是需要發生什麼的核心。只要確保設置回調並處理異常。

如果你想要我,並使用一個異步HTTP處理程序做的JSON-RPC如何,看看http://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#74311工作的例子也是在過程被調用和異步對象正在設置http://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#61720

。希望幫助。

+0

這正是我想要的。謝謝! – mouser58907 2012-05-04 02:05:57