28

我正在关注“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 是否会保留当前请求(发布聊天的用户的请求)并等到每个客户端都收到通知?
  • 对“客户端”的调用是否在后台完全异步并且此时请求被释放?

谢谢!

4

1 回答 1

47

您应该等待任务的唯一原因是当您使用横向扩展时。默认情况下,内存中的消息总线返回一个已完成的任务,因为操作非常快,没有必要让它异步,但如果你愿意,你可以这样做。要回答您的问题:

  • 我们不会在执行方法调用的同一调用堆栈上向客户端发送消息(例如,除了发布到消息总线之外,Clients.All.addNewMessage 不会等待任何内容)。没有请求线程会等待客户端接收任何内容(我们不支持等待客户端在 SignalR 中获取消息以进行正常调用)。

  • 即使您不在呼叫站点使用等待,它也始终是异步的。我们有一个消息代理,它实际上向客户端进行写入。当您调用该方法时,您只是将一条消息放入缓冲区。在未来的某个时间,该消息将被传递给客户端。

在横向扩展场景中,调用客户端方法会向外部服务(sql、redis、服务总线)发送一条消息,该消息可能会失败,因此您希望等待任务以便观察到异常。

希望有帮助

于 2013-10-05T02:58:19.640 回答