2009-02-19 94 views
10

調用Socket.Shutdown,Socket.Close和Socket.Disconnect後,看起來Socket.ReceiveAsync不會中止。嘗試再次在ReceiveAsync調用(文檔最佳實踐建議)使用導致錯誤的SocketAsycEventArgs對象:取消Socket.xxxxAsync調用

An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance

我有什麼做的就是ReceiveAsync將發佈關於該讓SocketAsyncEventArgs實例的抓地力?

編輯:我已經解決了這個問題,通過標記掛起的接收,並且在接收進來之前不進行任何清理(即完成已分派)。雖然感覺不太好。不能只是中止,如WebRequest API?

回答

6

似乎沒有辦法中止異步接收。

當套接字關閉時,這將強制接收完成,並且您的回調方法的SocketAsyncEventArgs參數的SocketError屬性值將爲SocketError.OperationAborted。遇到此情況時,可以將SocketAsyncEventArgs對象返回到可重用池。

這在示例here中示出。具體來說,查看ProcessReceive()方法,該方法在e.BytesTransferred == 0e.SocketError != SocketError.Success時調用CloseClientSocket()方法。 CloseClientSocket()方法是SocketAsyncEventArgs對象返回到池的地方。

0

最可能的原因是重用您呼叫的SocketAsyncEventArgs時:

SAE.Completed + =新的EventHandler(SocketEventArg_Completed);

這樣做會導致您的回調被稱爲多次!

確保只設置完成處理程序一次。

+0

這不會嘗試回答提出的問題。 OP的問題來自嘗試在`Completed`處理器被觸發之前重用`SocketAsyncEventArgs`。 – binki 2018-01-09 22:03:02