2011-05-11 2 views
0

많은 양의 데이터를 캐시하는 싱글 톤 WCF 서비스를 호스팅하는 Windows 서비스가 있습니다. Windows 서비스의 시작 업에 나는 뭐하는 거지 다음WCF "Fire and Forget"메서드로 인해 호스트 실행이 예상대로 계속되지 않습니다.

// start client service 
     wcfService= new ServiceHost(typeof(MyWcfService)); 
     wcfService.Open(); 

     using (HostedServiceReference.WcfServiceProxy wcfServiceProxy = new HostedServiceReference.WcfClientServiceProxy()) 
     { 
      wcfServiceProxy.RefreshDisplayCacheFromSource(); 
      // 1st echo to console 
      Console.WriteLine("Display Cache Refreshed")); 
     } 
     // 2nd echo to console 
     Console.WriteLine("Begin other processing")) 

및 서비스 계약에 다음과 같이 나는 방법을 설정 한 : 내가 바로 1, 2를 볼 것으로 예상했다

[OperationContract(IsOneWay=true)] 
    void RefreshDisplayCacheFromSource(); 
콘솔에 표시되는 에코가 있지만 실제로 볼 수있는 것은 첫 번째 에코입니다. 제 2 행은 "fire and forget"방법이 오랜 작업을 완료 할 때까지 표시되지 않습니다.

배경에서 무슨 일이 일어나는지 설명 할 수 있습니까?

내 이론이 지금까지 :

는 호스팅 서비스를 차단 싱글 모드에서 WCF 서비스의 작동인가?

사용하는 문장과 관련이 있습니까?

+0

이 게시물에 언급 된 것과 관련이있을 수 있습니다. [링크] (http://stackoverflow.com/questions/2176018/wcf-asyncpattern-true-orison-your-your-true) _ "IsOneWay가 스레드를 잠급니다. 유일한 차이점은 서버 측에서 전체 작업이 완료 될 때까지 기다리지 않는다는 것입니다. 서버 측에서 전체 메시지를 수신했음을 확인할 때까지 기다립니다. "_ – Franchesca

답변

1

WCF 서비스의 프록시 개체는 using 블록의 끝에 처리되지만 클라이언트가 서비스에서 메시지를 수신했다는 확인을받을 때까지는 처리 할 수 ​​없습니다. 메서드 본문 (많은 양의 데이터를 처리하는 것을 포함하여)에서 모든 코드를 실행하기 전까지 서비스가 승인을 보내지 않으므로 클라이언트에서 실행은 서비스가 끝날 때까지 using 블록의 끝에서 기다립니다 처리.

프록시 클라이언트에서 전역 변수를 개체 확인 :

내가이 문제를 해결하기 위해 사용할 수 있었던 두 가지 방법이 있습니다.

긴 처리를 처리하기 위해 서버의 스레드를 스핀 오프하여 서버 메소드가 클라이언트가 대기중인 승인과 함께 즉시 반환 할 수 있도록합니다.

0

WCF 호출이 해당 작업을 수행하는 동안 다른 작업을 계속할 수있게하려는 경우 서비스 참조를 마우스 오른쪽 단추로 클릭하고 "서비스 참조 업데이트"를 누릅니다. 비동기 메소드를 생성하는 옵션을 선택하십시오.

그런 다음이를 wcfServiceProxy.RefreshDisplayCacheFromSourceAsync();

완료 될 때 알림을 받으려면 이벤트 처리기를 추가 할 수 있습니다.

+0

이 경우 문제는 끝 부분에 프록시 개체를 처리하는 것이 었습니다. 블록을 사용. 기본 채널의 실제 폐쇄는 서비스가 완료 될 때까지 차단됩니다 (수신 확인을 보냄). 비동기 호출을 변경하면 문제가 해결되지 않습니다. – Franchesca

관련 문제