今日私はWCFの質問をしていますが、おそらく.NETの他のネットワークモデルも関係しています。WCF:DuplexSessionChannel、非同期操作、および例外
私はOneWay = trueのSend(Message)OperationContractを公開するWCFサービスを持っています。このサービスには、メッセージをクライアントに返すためのコールバックチャネルがあります。
とにかく私のクライアントからこのSendメソッドを非同期に呼び出すことを試みています。 DuplexSessionChannelでBeginSend(Message、OnSendComplete、null)を呼び出していて、DuplexSessionChannelでEndSend(asyncResult)を呼び出すOnSendComplete(IAsyncResult)メソッドがあります。
サービスにはCallbackContractがあり、クライアントに返すために同じBeginSend()/ EndSend()パターンが使用されます。このパターンは、私がOperationContext.Current.GetCallbackChannelで取得するコールバックチャネルで呼び出されます。
DuplexSessionChannelのクライアントは、サービスコールバックチャネルからメッセージを受信するときにBeginReceive()/ EndReceive()を呼び出します。
実際には機能していますが、End <Operation>
()メソッドが実際に何をしているのか分かりませんが、これが私に説明しておく必要があります。
コレクションが変更されていると不平を言って、サービス上のEndSend()の呼び出しで時折例外が発生するため、私は尋ねます(この例外の意味は分かりますが、起こっているか、まさに...)。私はSilverlightクライアントでPollingDuplexHttpBindingを使用しています。
私はWCFのエキスパートではありませんが、詳細を保持していません。知識が必要です。これまでの私のキャリアの中で、他の非同期操作の前にこの種のBegin/Endパターンを見たことがありますが、実際に何が起こっているのかは決して理解できません。
ありがとうございます。
は、次のシグネチャがあります。 たIAsyncResult BeginSend(メッセージ、AsyncCallback、オブジェクト) 空隙EndSend(たIAsyncResult)。 BeginSendに渡されたAsyncCallbackデリゲートによって呼び出されるコールバックメソッドの内部からEndSendを呼び出します。 EndSend()がvoidを返すことを考えれば、私はそれが何のためであるかまだ分かりません。私が見ている "結果"は、BeginSends AsyncCallbackから来ています。またBeginSend AsyncCallbackによって非同期的に返される場合、なぜBeginSendがIAsyncResultを返すのか理解できません。 – MrLane
この質問を投稿してから数ヶ月後にBriansの投稿を読んでください。 Juval LoweryのプログラミングWCFの本でも同様にこのことが説明されています。私はまだ例外の原因を知っていませんが、私はもはや結果が返されていないことを認識しているので、もはやEndSend()を呼び出さなくなってしまっています。私はこれが良い習慣であるかどうかは分かりません(おそらく私は例外の詳細を見逃す可能性があります)が、この本は省略可能であることを示唆しているようです。 – MrLane