2009-04-21 4 views
12

예약 된 간격으로 다른 WCF 서비스 호출을 비동기 적으로 호출해야합니다. WCF 서비스에 대한 호출 예약하기.샘플 화재가 필요하고 WCF 서비스에 대한 비동기 호출을 잊어 버림

내가 필요하다고 생각하고 여기에 대해 stackoverflow에 대해 ... (본질적으로) 준비 또는 WCF 서비스의 코드를 변경하여 비동기 호출을 처리 할 수 ​​있어야합니다. 만약 그렇다면 그 모양의 간단한 예제는 무엇일까? (예전과 후의 예) 또한 닷넷 3.5에서도 여전히 필요하다.

둘째 WCF 서비스의 프록시를 사용하여 다음 WCF 서비스에 대한 호출을 수행하고 WCF 서비스에 대한 비동기 호출 샘플이 필요합니다 (일반적인 비동기와 함께 BeginEnvoke 및 EndEnvoke와 다를 경우). 예.

내가 내 질문에 완전히 동의하지 않고 더 나은 질문을 수립 할 수 있도록 고맙게 생각한다.

+0

동시성 관리 예제를 포함하여 [IDesign.net] (http://idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11#ConcurrencyManagement)의 훌륭한 샘플이 많이 있습니다. –

답변

22

호출 대상 WCF 메서드에서 OperationContract 특성의 IsOneWay 속성을 true로 설정하십시오. 이것은 WCF에게 호출이 한 방향에 대해서만 중요하다는 것을 알리고 클라이언트는 메소드가 실행을 마칠 때까지 기다리지 않습니다.

BeginInvoke를 호출하는 경우에도 클라이언트 코드는 서버 메소드가 실행 완료 될 때까지 기다리지 만 스레드 풀 스레드에서 수행됩니다.

[ServiceContract] 
interface IWCFContract 
{ 
    [OperationContract(IsOneWay = true)] 
    void CallMe() 
} 

원하는 다른 방법은 WCF 서비스가 백그라운드 스레드로 작업을 돌려 즉시 반환하도록하는 것입니다.

+0

메시지 (메서드 호출)가 서비스에서 수신 될 때까지 클라이언트가 계속 차단 될 수 있습니다. 서비스의 동시성 정의 및/또는 전송 세션의 존재 여부에 따라 다릅니다. – Menahem

7

OneWay WCF 통화가 수행되는 방식을 신중하게 테스트하십시오. 마치 동시 호출 수가 X 개에 이르면 WCF가 실제로 호출이 끝날 때까지 대기하는 것처럼 멈추는 것을 보았습니다.

보다 안전한 해결책은 "대상"코드가 가능한 빨리 제어를 반환하도록하는 것입니다. 호출을 완전히 처리하게하는 대신 데이터를 대기열에 넣고 반환 만하십시오. 다른 스레드가 해당 큐를 폴링하고 비동기 적으로 데이터를 처리하도록하십시오.

그리고 해당 큐에서 작동하는 두 스레드 간의 충돌을 피하려면 스레드 안전 메커니즘을 적용해야합니다.

0

패턴에 BeginInvoke 또는 스레드를 사용하지 마십시오. Microsoft 웹 사이트에 따라 AsyncPattern을 사용하여 클래스를 꾸며야합니다. 그렇지 않으면 Async 대리자와 스레드가 동기 모드로 실행됩니다. WCF는이 동작을 강제합니다. 이 정보는 다른 op가 스택에 콜백 질문을 차단하는 해결책을 찾았습니다. 미안하지만 링크가 기억 나지 않습니다.

관련 문제