2012-10-15 11 views
1

는 단순히문을 사용할 때 비동기 wcf 메서드를 호출하는 방법? 동기식 모델에서

using (MyServiceClient msc = new MyServiceClient()) 
{ 
    msc.Method(); 
} 

이다하지만이 방법의 끝에 기다린 후 무언가를해야하는 경우, 그것은 using에서 비동기 mehod를 호출하는 방법 또한

private void EventHandler<MethodCompletedEventArgs> myEventHandler = new EventHandler<MethodCompletedEventArgs>(methodBody); 

using (MyServiceClient msc = new MyServiceClient()) 
{ 
    msc.MethdCompleted += myEventHandler; 
    msc.BeginMethod(); 
} 

private void MethodBody() 
{ 
//exception: client state is aborted 
} 

작동하지 않을 수 있습니다 성명서?

+0

서비스를 호출하는 응용 프로그램 유형은 무엇입니까? –

+4

이벤트 핸들러에서 Dispose 호출 –

답변

1

이벤트가 다시 호출되면 서비스 클라이언트에 대한 참조를 저장하고 수동으로 Dispose 메서드를 호출 할 수 있습니다. 예외를 관리하고 일반적으로 Dispose이 호출되도록 추가 작업을 수행하면됩니다. 또한 이전 인스턴스가 완료 될 때까지 기다리는 동안 msc의 여러 인스턴스를 작성/덮어 쓸 수있는 조건을 확인하십시오.

동일한 코드를 여러 번 실행하면 잘못된 인스턴스를 처리하지 않도록하는 한 가지 방법은 다음과 같습니다. 로컬 람다/익명 함수를 사용하는 :

MyServiceClient msc = new MyServiceClient(); 

msc.MethdCompleted += (sender, args) => 
{ 
    try 
    { 
     myEventHandler(sender, args); 
    } 
    finally 
    { 
     msc.Dispose(); 
    } 
}; 

msc.BeginMethod(); 

그것은보다 조금 지저분를 얻을 수 있습니다; msc.BeginMethod()에 예외가 발생하면 Dispose을 호출해야합니다 (단, Dispose 번을 두 번 이상 호출하지 않으려는 경우).

+0

충분하지 않습니다. Dispose 메서드는 Close()를 호출합니다. Close()는 네트워크를 통해 호출하여 상대방에게 연결을 해제하도록 알립니다. 연결이 Fault, Closing 또는 Closed 상태에 있으면 Close() 호출은 예외를 throw하고 리소스가 정리되지 않습니다. 이 경우 Abort()를 호출해야합니다. 그래서 try/finally 나 using() {}을 사용하는 것은 안전하지 않습니다 ... – Craig

6

이렇게하면 안됩니다.

비동기 콜백 처리기에서 MyServiceClient을 일반적으로 인스턴스화 한 다음 Dispose을 인스턴스화해야합니다.

이 방법은 콜백 핸들러가 호출 된 후에도 인스턴스가 존재하는지 확인하고 콜백 핸들러가 작업을 마친 후에는 제거되도록하는 유일한 방법입니다.

관련 문제