backgound:ADO 1.0 DBServerSyncProviderの同期サービスによって発生したサーバー側のApplyChangeFailedイベントをクライアントに転送しようとしています。同期サービス競合解決のすべてのコード例ではWCFは使用されず、クライアントが直接サーバーデータベースに接続するときにこの問題は存在しません。私のDBServerSyncProviderはヘッドレスWCFサービスでラップされていますが、ユーザーに問題のあるデータを含むダイアログを表示してレビューすることはできません。WCFネストされたコールバック
したがって、明白な解決策は、Sync Servicesが生成したHTTP WCFサービスをTCPに変換し、それをデュプレックス接続にして、SyncConflictオブジェクトを受け取ったクライアントでコールバックハンドラを定義し、行事。私がすることをしなかった場合には(コールバックが試みられた前)
、私はランタイムエラーを得た:
のSystem.InvalidOperationException:現在のメッセージの処理が完了するまで 応答が受信できないため、この操作は、デッドロックです。 アウトオブオーダーのメッセージ処理を許可する場合は、ConcurrencyModeを ReentrantまたはMultipleをCallbackBehaviorAttributeに指定します。
私は、メッセージが示唆し、サービスとコールバックの両方の動作をMultiple属性で修飾しました。その後、ランタイムエラーはなくなりましたが、コールは「デッドロック」になり、決して返されません。これを回避するにはどうすればよいですか?元のサービスコールが返される前にクライアントをコールバックするWCFサービスを使用することはできませんか?
編集:私はthisが問題の説明かもしれないと思っていますが、正しい解決策が何であるべきかまだ分かりません。
いくつかのより多くを介してこれを考えた後、私は私のポストのリンクの背後にあるスレッドは、この問題のための優れた推論を持っていることを認識しました。問題は、コールバックが別のスレッドで行われなければならないということではありません。サーバー上で実行されるため、これは関係ありません。デッドロックはクライアント上で発生します。私は自分のコードで回答を投稿します。 – cdonner