28

http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-serverの「SignalR チュートリアル」に従っています。

それでは、この単純な Chat Method を想定してみましょう:

public void Send(string name, string message)
{
     // Call the addNewMessageToPage method to update clients.
     Clients.All.addNewMessageToPage(name, message);
}

50,000 人のユーザーがいるチャット ルームがあるとします。次のように、Send メソッドを非同期に変更する利点はありますか。

 public async Task Send(string name, string message)
 {
     // Call the addNewMessageToPage method to update clients.
     await Clients.All.addNewMessageToPage(name, message);
 }
  • IIS は (チャットを発行したユーザーの) 現在の要求を保持し、すべてのクライアントに通知されるまで待ちますか?
  • 「クライアント」への呼び出しは内部で完全に非同期であり、要求はこの時点で解放されますか?

ありがとうございました!

4

1 に答える 1

47

タスクを待機する唯一の理由は、スケールアウトを使用している場合です。デフォルトでは、メモリ内メッセージ バスは完了したタスクを返します。これは、操作が非常に高速であるため、非同期にする意味がありませんが、必要に応じて非同期にすることができます。質問に答えるには:

  • メソッド呼び出しを実行している同じコール スタックでクライアントに送信しません (たとえば、Clients.All.addNewMessage は、メッセージ バスへのパブリッシュ以外は待機しません)。クライアントが何かを受信するのを待機する要求スレッドはありません (クライアントが通常の呼び出しのために SignalR でメッセージを取得するのを待機することはサポートされていません)。

  • 呼び出しサイトで await を使用しなくても、常に非同期です。実際にクライアントへの書き込みを行うメッセージ ブローカーがあります。そのメソッドを呼び出すときは、メッセージをバッファに入れているだけです。将来のある時点で、そのメッセージがクライアントに配信されます。

スケールアウト シナリオでは、クライアント メソッドを呼び出すと外部サービス (SQL、Redis、サービス バス) にメッセージが送信されますが、これは失敗する可能性があるため、例外が監視されるようにタスクを待機する必要があります。

それが役立つことを願っています

于 2013-10-05T02:58:19.640 に答える