我從UdpClient通過平時的異步回調接收數據:如何知道UdpClient是否已關閉/處置?
private void OnUdpData(IAsyncResult result)
{
byte[] data = _udpReceive.EndReceive(result, ref _receiveEndPoint);
//Snip doing stuff with data
_udpReceive.BeginReceive(OnUdpData, null);
}
當我在主線程Close()
的UdpClient,回調火災,因爲我所期望的,但在這一點_udpReceive
已經佈置和我當我嘗試撥打時,請致電EndReceive()
。我期待得到一個空的緩衝區。
什麼是正確的操作方法是什麼?有沒有的UdpClient
一些成員,我可以嘗試使用它之前檢查,或將其包裝都在一個try{}
,趕上ObjectDisposedException
的唯一途徑?這對於正常關閉來說似乎非常討厭。
回調是否解除了調用'EndReceive'的責任之一?我的印象是,除了某些不綁定資源的類型'IAsyncResult'(例如'Control.BeginInvoke'的返回值)之外,總是應該*每次'BeginXX'後總是調用'EndXX'。請注意,所遇到的異常並不表示「EndReceive」操作失敗,而是「成功的」EndReceive調用中繼導致接收嘗試的異常的結果。 – supercat 2012-02-24 17:22:12
是不是隻調用EndX來從BeginX獲取數據?那麼在這種情況下,返回是好的。 EndReceive將檢查相同的東西,並拋出一個處置異常。 – Will 2012-02-25 15:49:50