1

クライアントがサーバーにサブスクライブし、更新がクライアントにプッシュバックされるWCFを使用してアプリを作成しています。

サブスクライバーは、サーバーでSubscribe()メソッドを呼び出すDuplexPipeChannelを使用してサーバーにサブスクライブします。

サーバーはサブスクライバーのList<>を維持し、サブスクライバーにプッシュするデータがある場合は、PushData()メソッドを呼び出します。

私の意図は、各サブスクライバーでpushメソッドを呼び出すサブスクライバーのリストを順番に繰り返すことです。

私が知りたいのは、サブスクライバーのpushメソッドの呼び出しがブロックされているかどうかです。接続に障害が発生したり、サブスクライバーの1つへの接続が遅延したりすると、残りのプッシュ呼び出しが遅延しますか(またはさらに悪いことに失敗します)?

これが明らかな質問である場合は申し訳ありませんが、私はこれまでほとんど.Net 2.0を使用していたため、WCFについてはほとんど知りません。

私のWCFコードは、このチュートリアルに大まかに基づいています。

別の質問 同期していると仮定すると、クライアント側の要求を処理するために新しいスレッドを生成する方がよいのでしょうか、それとも「プッシュサーバー側」ごとに新しいスレッドを生成する方がよいのでしょうか。

4

2 に答える 2

4

WCF呼び出しはデフォルトで同期ですが、非同期に設定することもできます。以下のジャレットの答えを参照してください。こちらをご覧ください。実際にデータを期待しているかどうかに関係なく、送信するすべてのメッセージに結果が返されます。

サーバーの動作に応じて、呼び出しはブロックされます。サーバー上のPushDataが実際にサブスクライバーリストを反復処理し、それぞれにメッセージを送信する場合、それは実行されます。PushDataがデータのみを挿入し、別のスレッドがサブスクライバーへのデータの送信を処理する場合、サーバーがデータを挿入して戻る間のみブロックされます。

お役に立てれば。

編集:クライアント側とサーバー側のスレッドの生成について。サーバ側。クライアントの呼び出しに時間がかかる場合、それはしばらくの間ですが、サーバーが実際に同じ呼び出しで他のクライアントに呼び出しを送信しているために時間がかかる場合は、何かが間違っています。実際、毎回新しいスレッドを生成することはありません。サーバー側でプロデューサー/コンシューマーパターンを作成するだけで、データアイテムがキューに入れられるたびに、コンシューマーがそれを取得します。地獄、あなたも複数の消費者を持つことができます。

于 2009-02-25T14:48:00.240 に答える
3

サービス参照を右クリックすると、非同期呼び出しを作成するオプションが表示されます。(セットアップ ダイアログにチェックボックスがあります。) 私は通常、Async メソッドを作成し、結果をリッスンします。少し手間がかかりますが、非同期サービス操作を使用して、はるかに応答性の高いアプリケーションを作成できます。

于 2009-02-25T15:13:04.393 に答える