2013-10-05 9 views
19

Sto seguendo il "SignalR Tutorial" a: http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-serverI metodi signalr sul lato server dovrebbero essere asincroni quando si chiamano i client?

Quindi supponiamo che questo semplice metodo di Chat:

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

Supponiamo che io ho una chat room con 50 000 utenti. Ci sarebbe alcun beneficio di cambiare il metodo Send di essere asincrona, come questo:

public async Task Send(string name, string message) 
{ 
    // Call the addNewMessageToPage method to update clients. 
    await Clients.All.addNewMessageToPage(name, message); 
} 
  • Will IIS tenere la corrente richiesta (dell'utente che ha pubblicato la chat ) e attendere che tutti i clienti vengono informati?
  • è la chiamata a "Client" del tutto asincrono sotto il cofano e la richiesta viene rilasciato a questo punto?

Grazie!

risposta

35

L'unico motivo per cui è necessario attendere l'operazione è quando si utilizza ridimensionamento. Per impostazione predefinita, il bus dei messaggi in memoria restituisce un'attività completata poiché l'operazione è così veloce che non è necessario renderla asincrona, ma è possibile farlo se lo si desidera. Per rispondere alle vostre domande:

  • Non inviamo ai client della stessa chiamata stack di fare l'invocazione del metodo (ad esempio Clients.All.addNewMessage non attende il nulla, tranne la pubblicazione al bus messaggio). Nessun thread di richiesta attenderà che i client ricevano qualcosa (non supportiamo l'attesa sul client che riceve il messaggio in SignalR per invocazioni normali).

  • E 'sempre asincrona, anche se non si utilizza attendere presso il sito di chiamata. Abbiamo un broker di messaggi che effettivamente scrive ai clienti. Quando si chiama questo metodo, si sta solo mettendo un messaggio in un buffer. In futuro, quel messaggio verrà consegnato ai clienti.

Nello scenario ScaleOut, chiamando un metodo client invia un messaggio a un servizio esterno (SQL, Redis, autobus di servizio) e che può non così si vuole attendere il compito in modo che vengano rispettate le eccezioni.

Speranza che aiuti

Problemi correlati