2011-11-28 63 views
1

我一直在尋找MSDN上的Asynchronous ClientAsynchronous Server Socket示例,並且愉快地打出了一個客戶端連接到一個服務器時可以完美工作的示例。我的問題是我需要將大量工作與大量機器同步,以便它們幾乎同時執行(如毫秒差異)。該操作相當簡單,與子服務器(全部運行在同一臺計算機上但在不同端口上進行初始測試)交談,模擬其處理並將「就緒」信號發送回主叫方。一旦所有的服務器都返回了這個標誌(或發生超時),從客戶端傳遞給確認服務器的第二條消息告訴它們執行。將多個異步客戶端應用到多個服務器時發生ObjectDisposedException

到目前爲止,我的做法是創建兩個客戶端實例,存儲在列表中,並通過循環列表來啓動例程。這很有效,但並不是特別快,因爲每個客戶端的例程都是同步運行的。爲了加速這個過程,我創建了一個新的線程併爲每個客戶端執行該例程。現在,這可以讓兩個或更多服務器返回並適當地進行同步。不幸的是,這是很容易出錯,並在下一行的「ReceiveCallback」方法「的ObjectDisposedException」異常的代碼錯誤...

// Read data from the remote device. 
int bytesRead = client.EndReceive(ar); 

隨着一些調查和調試跟蹤我的插座被傳遞到例程(使用它的句柄)並在沒有連接時找到,它總是第二個返回失敗的套接字,而不是第一個成功讀取其響應的套接字。另外,這些套接字實例(基於句柄值)似乎是單獨的實例,但不知何故,第二個(以及後續的響應)在這一行上繼續出錯。

什麼導致這些套接字在被合法地處理之前不恰當地處置自己?由於它們在單獨的線程中運行並且沒有共享例程,因此第一個套接字在其他實例上被不恰當地使用了嗎? Tbh,我覺得在海上有點失落,雖然我可以幫助解決這些錯誤,但代碼的可靠性和可能丟失回覆確認並不是有利的目標。任何指針?

親切的問候

+0

行 - 釘了它。但我並不完全確定我有100%密封的解釋,但我通過確保方法不再是靜態的以及ManualResetEvent標誌來解決錯誤。 Tbh我認爲套接字代碼會匿名訪問這些方法,'private'關鍵字將確保範圍 - 不知何故,情況並非如此。 Anyhoo - 解決它,如果有些困惑... – SeanCocteau

回答

1

原來的共享/靜態ManualResetEvent的是被設置在不同的實例,因此線程1將設置ManualResetEvent的佈置所述第二線程上的插座。通過確保沒有方法/屬性被共享/靜態 - 每個線程和套接字將在其自己的範圍內執行。