2012-01-28 4 views
1

나는 서로 통신하고, 명령을 실행하고, 데이터를 앞뒤로 전송해야하는 여러 인스턴스가있는 C# 프로그램이 있습니다. 지금 당장은 WM_COPYDATA를 사용하여 수행합니다. 이는 상당히 번거 롭습니다. 이 NetNamedPipeBindings 사용하여 WCF 시스템으로 업그레이드하고 싶습니다. 그러나 어떤 설정을 시도해도 재진입 이중 통신을 사용할 수 없습니다.WCF와 재진입 이중 통신

이 일반 WCF 호출 될 것이다 :

client calls proxy.foo 
    server executes foo 
    server finishes foo 
client returns from proxy.foo 

그리고 이것이 내가 원하는 것입니다 : 비판적

client calls proxy.foo 
    server executes foo 
    server calls callback.bar 
     client executes bar 
     client calls proxy.baz 
      server executes baz 
      server finishes baz 
     client returns from proxy.baz 
     client finishes bar 
    server returns from callback.bar 
    server finishes foo 
client returns from proxy.foo 

, 나는 proxy.foo가 동일한 스레드로 호출하는 클라이언트 스레드를 원하는 proxy.baz를 호출합니다. Windows 메시지의 경우 이는 코스와 동일합니다. 그러나 어떤 설정을 시도해도 WCF를 통해 작동하는이 패턴을 얻을 수 없습니다. 심지어 가능할까요?

답변

2

호출을 비동기로 설정하고 수동으로 인터리브를 처리하고 올바른 스레드로 마샬링하지 않으면 내가 어떻게 가능한지 알 수 없습니다. 결국 클라이언트 (스레드)가 서버를 호출하고 서버가 응답을 반환 할 때까지 차단됩니다. 따라서 클라이언트 스레드가 이미 차단되었으므로 클라이언트로 다시 호출하면 코드가 교착 상태가됩니다.

+0

한숨 ... 나는 COPYDATA를 고수 할 것 같다. 나는 WCF가 이것을지지하지 않는다는 것에 매우 놀랐다. –

+1

나는 이것에 대해 약간의 테스트를했는데 위의 내용이 다소 정확했지만 전체적인 이야기는 아닙니다. : S ConcurrencyMode = ConcurrencyMode.Reentrant를 설정하고 clint 스레드가 SyncFormation 컨텍스트 (예 : WinForm 또는 직접 작성)를 가지고 있으면 콜백은 자동으로 원래 스레드로 marchall됩니다. 클라이언트의 원래 호출을 async'ed로 만들어야하기 때문에 (위에서 설명한대로) 서버 호출이 비동기 패턴을 구현해야합니다. 체크 아웃 할 수있는 "작은"테스트 프로젝트를 만들었습니다 : [link] (http://www.noer.it/upload/Test_WcfReentrant.zip) – Reonekot