2014-02-05 6 views
2

와 클라이언트 프록시를 닫 난과 같이 비동기 메소드를 호출하는 데 사용하는 WCF 클라이언트 프록시를?어떻게 비동기 호출 WCF

발신자 개체를 사용하여 svcref_DoSomethingCompleted의 첫 줄에 표시합니까?

MS 문서에서 콜백이 아닌 기본 스레드 내에서 프록시를 닫습니다. 그 좋은 연습 이니? 나에게 잘못 보인다 :

http://msdn.microsoft.com/en-us/library/ms730059(v=vs.110).aspx

나는 또한 내가 가지 거라고 무엇 대리자 콜백에서 프록시를 닫 제안 작업 기반 비동기를 사용하여,이 발견은 기대 :

http://fun-with-blackhawk.blogspot.com/2010/03/wcf-exception-handling-in-asynchronous.html

+1

을 나는 차단'Console.ReadLine()'전'클라이언트가 있기 때문에 샘플이 작동 추측 .Close()'. 그것이 없으면 통화가 완료되기 전에 클라이언트를 종료했을 가능성이 높습니다. –

답변

1

여기가 WCF가 까다로워집니다. 서버가 콜백 메소드를 호출하면 클라이언트 프록시가 닫히기 전에 해당 호출을 완료해야합니다. 이것은 클라이언트와 왕복으로 왕복하는 것을 의미합니다. Microsoft 예제는 Console.ReadLine()을 통해 클라이언트 측에서 사용자 입력을 요청하여 닫기를 트리거합니다. 비동기 콜백을 사용하여 닫기를 트리거하려면 광고 소재를 가져와야합니다. 예를 들어, 새 스레드에 닫기를 대기시킨 다음 실행을 지연시킬 수 있습니다. 이렇게하면 콜백이 서버로 돌아가서 채널을 닫을 수 있습니다.

콜백이 같은 추가 : 다음

var currentChannel = OperationContext.Current.Channel; 
ThreadPool.QueueUserWorkItem(o => CloseChannel(currentChannel)); 

이를 CloseChannel을 위해 :

private static void CloseChannel<T>(T channel) 
{ 
    var clientChannel = (IClientChannel)channel; 
    var success = false; 
    try 
    { 
     //sleep before close so the main thread has a chance to catch up 
     Thread.Sleep(10000); 
     clientChannel.Close(); 
     success = true; 
    } 
    catch (CommunicationException ce) 
    { 
     clientChannel.Abort(); 
    } 
    catch (TimeoutException te) 
    { 
     clientChannel.Abort(); 
    } 
    finally 
    { 
     if (!success) 
      clientChannel.Abort(); 
    } 
} 
관련 문제