我正在关注:http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server
上的“SignalR Tutorial”让我们假设这个简单的聊天方法:
public void Send(string name, string message)
{
// Call the addNewMessageToPage method to update clients.
Clients.All.addNewMessageToPage(name, message);
}
假设我有一个拥有5万用户的聊天室。将Send方法更改为异步会有什么好处,如下所示:
public async Task Send(string name, string message)
{
// Call the addNewMessageToPage method to update clients.
await Clients.All.addNewMessageToPage(name, message);
}
谢谢!
答案 0 :(得分:40)
等待任务的唯一原因是当你使用横向扩展时。默认情况下,内存消息总线返回一个已完成的任务,因为操作速度非常快,没有必要使其异步,但如果您愿意,则可以。回答你的问题:
我们不会在进行方法调用的同一个调用堆栈上发送给客户端(例如,除了发布到消息总线之外,Clients.All.addNewMessage不会等待任何事情)。没有请求线程会等待客户端接收任何东西(我们不支持在客户端上等待获取SignalR中的消息以进行正常调用)。
即使您不在呼叫站点使用等待,它始终是异步的。我们有一个消息代理,实际上是写客户端。当您调用该方法时,您只是将消息放入缓冲区。在将来的某个时间,该消息将传递给客户。
在扩展方案中,调用客户端方法会向外部服务(sql,redis,服务总线)发送消息,并且该消息可能会失败,因此您希望等待该任务以便观察到异常。
希望有所帮助