2013-10-05 6 views
19

ich nach dem "SignalR Tutorial" auf: http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-serverSollen serverseitige Methoden beim Aufruf von Clients async sein?

Also lassen Sie uns diese einfache Chat-Methode übernehmen:

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

Nehmen wir an, ich mit 50 000 Benutzern Chat-Raum haben. Gäbe es keinen Nutzen Sie die Send-Methode der Änderung async, so zu sein:

public async Task Send(string name, string message) 
{ 
    // Call the addNewMessageToPage method to update clients. 
    await Clients.All.addNewMessageToPage(name, message); 
} 
  • Will IIS den aktuellen Anfrage halten (der Benutzer, der die Chat veröffentlicht) und warten Sie, bis alle Kunden informiert werden?
  • Ist der Aufruf von "Client" völlig asynchron unter der Haube und die Anfrage ist freigegeben zu diesem Zeitpunkt?

Vielen Dank!

Antwort

35

Der einzige Grund, warum Sie die Aufgabe erwarten sollten, ist, wenn Sie Scaleout verwenden. Standardmäßig gibt der In-Memory-Nachrichtenbus eine abgeschlossene Aufgabe zurück, weil die Operation so schnell ist, dass es keinen Sinn macht, sie asynchron zu machen, aber Sie können, wenn Sie möchten. Zur Beantwortung Ihrer Fragen:

  • Wir senden nicht für Kunden auf dem gleichen Call-Stack den Methodenaufruf zu tun (z Clients.All.addNewMessage wartet nicht auf irgendetwas außer dem Nachrichten Bus veröffentlicht). Kein Request-Thread wartet auf Clients, um irgendetwas zu empfangen (wir unterstützen nicht, auf dem Client zu warten, um die Nachricht in SignalR für normale Aufrufe zu erhalten).

  • Es ist immer async, auch wenn Sie nicht auf der Aufrufseite warten verwenden. Wir haben einen Nachrichtenbroker, der das Schreiben an die Kunden tatsächlich ausführt. Wenn Sie diese Methode aufrufen, fügen Sie einfach eine Nachricht in einen Puffer ein. Irgendwann in der Zukunft wird diese Nachricht an die Kunden geliefert.

Im ScaleOut Szenario sendet so wollen Sie die Aufgabe erwarten eine Client-Aufruf der Methode nicht, eine Nachricht an einen externen Service (SQL, redis, Service Bus), und das kann, so dass Ausnahmen eingehalten werden.

Hoffe, dass hilft