2013-10-05 114 views
19

我在繼「SignalR教程」:http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server調用客戶端時Signalr服務器端方法應該是異步的嗎?

因此,讓我們假設這個簡單的聊天方式:

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

假設我有一個聊天室與50個000用戶。會有改變發送方法是異步的任何好處,像這樣:

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中獲取正常調用的消息)。

  • 即使您不在呼叫地點使用等待,它總是異步的。我們有一個消息中間商,實際上是寫給客戶的。當你調用這個方法時,你只是把一條消息放入緩衝區。在未來的某個時候,這些信息會傳送給客戶。

在scaleout情況下,調用客戶端的方法將消息發送到外部服務(SQL,Redis的,服務總線),而且可能會失敗,所以你想,這樣的例外觀察等待任務。

希望可以幫到