2009-09-13 2 views
3

문서 및 기사를 기반으로 예기치 않은 예외/오류가 발생하면 클라이언트 프록시에서 Abort()를 호출하는 것이 좋습니다. 다음을 참조하십시오 (단순화 된) :IClientChannel 프록시에서 Abort()를 호출하면 예외가 발생할 수 있습니까?

MyServiceClient proxy = null; 
try { 
    proxy = new MyServiceClient(); 
    proxy.DoSomething(); 
    proxy.Close(); 
} catch (Exception ex) { 
    if (proxy != null) 
     proxy.Abort(); 
} 

예외 자체를 발생시키는 Abort() 호출 가능성이 있습니까? Abort()에 대한 호출이 자체 try/catch 내에 있어야합니까?

+0

왜이 스 니펫에는 null 체크가 있습니까? –

+1

나는 try 블록 안에 프록시의 인스턴스를 넣으려고했다. 따라서 인스턴스화에 문제가있는 경우 null 확인이 필요합니다. 과잉 공격일지도 모르지만, 중단하라는 프록시가 있다고 확신합니다. – Elan

답변

3

아니요, 중단하지 마십시오 (하지만 .Close() 또는 .Dispose() 할 수 있음). .Abort() 호출은 채널 종료에 대한 "슬레지 해머 (sledgehammer)"접근 방식입니다. 진행중인 메시지 처리에 관계없이 채널이 종료됩니다.

주의해서 사용하십시오. .Close()를 호출하지 못했을 때 예외적 인 경우에 실패했다. 그것이 진정한 목적이며 적절한 사용입니다.

마크

+2

위의 catch 블록에서 채널에 대한 중단을 호출하지 않으면 어떻게됩니까? –

+2

클라이언트와 서버 간의 채널이 제대로 닫히지 않고 처리되지 않으므로 시스템에서 사용되지 않는 채널이 남아있을 가능성이 있습니다. 궁극적으로는 가비지 수집 될 것입니다.하지만 시간이 걸릴 때까지는 유용하지 않은 목적으로 시스템 리소스를 사용하고 있습니다. –

+0

이 소유권 주장을 뒷받침 할만한 참고 자료가 있습니까? Abort가 어떠한 상황에서도 예외를 던지지 않을 것임을 확신하고 싶습니다. –

관련 문제