: 내가 메인 스레드에 UdpClient를 Close()
때UdpClient가 폐쇄/폐기되었는지 어떻게 알 수 있습니까?
private void OnUdpData(IAsyncResult result)
{
byte[] data = _udpReceive.EndReceive(result, ref _receiveEndPoint);
//Snip doing stuff with data
_udpReceive.BeginReceive(OnUdpData, null);
}
가 콜백 화재 내가 기대하는 것처럼,하지만이 시점 _udpReceive
에 이미 배치되어 내가 얻을 ObjectDisposedException
전화를 걸어 EndReceive()
으로 전화하십시오. 나는 단지 빈 버퍼를 얻을 것으로 예상했다.
이 문제를 해결하는 올바른 방법은 무엇입니까? UdpClient
의 멤버가 있습니까? 사용하려고하기 전에 확인할 수 있습니까? 또는 try{}
에 모두 랩핑하고 ObjectDisposedException
을 잡을 수있는 유일한 방법입니까? 정상적인 닫기를 위해 꽤 심술 것 같습니다.
콜백은 'EndReceive'를 호출해야 할 책임을 해 줍니까? 제 인상은 리소스를 묶지 않는 (예를 들어'Control.BeginInvoke'의 반환 값) 몇몇 유형의'IAsyncResult '를 제외하고는'BeginXX'마다 * 항상 * EndXX를 호출한다고 가정합니다. 예외를 잡는 예외는'EndReceive' 연산이 실패했다는 신호가 아니라 수신 성공을 초래 한 예외를 중계하는 "성공적인"EndReceive 호출의 결과입니다. – supercat
BeginX에서 데이터를 가져 오기 위해 EndX가 호출되지 않습니까? 이 경우 리턴은 괜찮습니다. EndReceive는 동일한 것을 검사하고 어쨌든 처분 된 예외를 던집니다. – Will