2012-01-28 14 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スレッドが(WinFormのように)同期化コンテキストを持つ場合、コールバックは自動的に元のスレッドにmarchallされます。また、クライアントからの元の呼び出しを非同期にする必要があるため(上​​記のように)、非同期パターンを実装するためのサーバー呼び出しが必要です。 私はあなたがチェックアウトできる "小さな"テストプロジェクトを作った: [link](http://www.noer.it/upload/Test_WcfReentrant.zip) – Reonekot