2


0

WCF:コールバックは非同期ではありません

WCFが提供するコールバックインフラストラクチャに基づいてクライアントサーバーをプログラムしようとしていますが、非同期では動作しません。

私のクライアントはloginメソッドを呼び出してサーバーに接続します。

MyCallback callback =
      OperationContext.Current.GetCallbackChannel()

その後、サーバーは何らかの処理を行い、コールバックオブジェクトを使用してクライアントと通信します。

これはすべて機能しますが、問題は、 `+ OperationContract `のメソッドを ` IsOneWay = true +`に設定したにもかかわらず、クライアントへの呼び出しを行うとサーバーがハングするという事実にあります。

これは、Visual Studioでサーバーをデバッグ用に起動し、デタッチし、クライアントを起動し、上記のloginメソッドを呼び出し、クライアントの実装済みコールバックメソッドにブレークポイントを設定し、サーバーに応答を送信させることによってテストしました。クライアントに。 サーバーは、クライアントの応答を待って、本来のことをやめます。

任意の助けは大歓迎です。

3 Answer


1


トリックは、サーバーから非同期でコールバックを呼び出すことです。 これを見てください。

[OperationContract(IsOneWay = true、AsyncPattern = true)] IAsyncResult BeginOnMessageReceived(LiveDataMessageメッセージ、AsyncCallback acb、オブジェクトの状態); void EndOnMessageReceived(IAsyncResult iar);


0


あなたの問題に対する解決策はあなたのサービスのために 'ConcurecyMode’と 'Instance ContextMode’属性を適切に設定することであると思います。 そのためには、以下の例に示すように、サービス宣言をこれらの属性で装飾する必要があります。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single、ConcurrencyMode = ConcurrencyMode.Reentrant)]パブリッククラスSubscriberService:ISubscriberServiceContract {...}

InstanceContextMode.Singleは、サービスをシングルトンオブジェクトとして構築するため、すべてのクライアントに対して実行されるサービスのインスタンスは1つだけです。

ConcurencyMode.ReentrantまたはConcurencyMode.Multipleは、サービスインスタンスのマルチスレッド作業を有効にします。 'Multiple’の場合、あなたはあなたのサービスの中でスレッド同期化の面倒を見なければなりません。


0


設定しようとしましたか

[CallbackBehavior(UseSynchronizationContext = false)]

コールバックインターフェイスを実装しているクライアント側のオブジェクトでは?