在调用客户端时,signalr服务器端方法应该是异步的吗?

时间:2013-10-05 02:50:06

标签: asp.net-mvc-4 asynchronous signalr

我正在关注: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);
 }
  • IIS是否会保留当前的请求(发布的用户) 聊天)并等到每个客户都收到通知?
  • 对“客户端”的调用是否完全异步,请求是 在这一点上发布了吗?

谢谢!

1 个答案:

答案 0 :(得分:40)

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

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

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

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

希望有所帮助