2013-10-05 7 views
19

私は上の「SignalRチュートリアル」を以下のよ:それでは、この簡単なチャット方式を想定してみましょうhttp://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-serverクライアントを呼び出すときに、シグナル側のサーバー側のメソッドを非同期にする必要がありますか?

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は( チャットを公開したユーザーの)現在の要求を保持し、すべてのクライアントが通知されるまで待つのでしょうか?
  • フードの下で「クライアント」の呼び出しが完全に非同期で、要求が になっていますか?

ありがとうございます!

答えて

35

スケールアウトを使用しているのは、作業を待つ必要がある唯一の理由です。デフォルトでは、メモリー内メッセージバスは完了したタスクを返します。操作が非常に速いため、非同期にする必要はありませんが、できればできます。あなたの質問に答えるために:私たちは、メソッド呼び出しを行う同じコールスタック上のクライアントに送信しません

  • (例えばClients.All.addNewMessageは、メッセージ・バスへの公開以外のものに待機しません)。リクエストスレッドはクライアントが何かを受け取るのを待つことはありません(通常の呼び出しでは、クライアントがSignalRでメッセージを受け取るのを待つことをサポートしていません)。

  • コールサイトでawaitを使用しなくても、常に非同期です。私たちにはメッセージブローカーがあり、実際にクライアントに書いています。そのメソッドを呼び出すと、メッセージをバッファに入れるだけです。将来的には、そのメッセージがクライアントに配信されます。スケールアウトのシナリオでは

、クライアントのメソッドを呼び出すと、外部サービス(SQL、Redisの、サービス・バス)にメッセージを送信し、それはあなたが、例外が観察されるようにタスクを待つしたいので、失敗する可能性があります。

希望があれば

関連する問題