使用Signaler Hub方法进行异步/等待

时间:2019-11-13 09:40:42

标签: c# asynchronous async-await signalr

所以我已经开始为“ x”应用程序开发超级计算机。与Uber的概念相同。以下代码是我的Signalr集线器上的代码。我使用Signalr在客户端和服务器之间进行通信。因此,当客户请求帮助时,它将连接到RequestForHelp。然后,RequestForHelp将请求发送回正确的供应商。并根据供应商的回答,调用HelpResponseYes HelpResponseNo。我想使它异步。我想将requestforhelp当作任务。因此,当我单击请求按钮时,程序将等待。有什么建议可以做到吗?

public void RequestForHelp(RequestDetails requestDetails, Location customerClientLocation, int customerClientId)
    {
        Customer Customer = Service.CustomerService.GetCustomerById(requestDetails.CustomerId);
        Customer.ClientId = customerClientId;
        Customer.ClientLocation = customerClientLocation;
        requestDetails.Customer = Customer;

        Clients.User(requestDetails.NearestSupplierList.FirstOrDefault().AspNetUserID).requestForHelpInClient(requestDetails);
    }

    public void HelpResponseYes(RequestDetails requestDetails)
    {
        //A supplier is matched
    }

    public void HelpResponseNo(RequestDetails requestDetails)
    {
       //next supplier on the list     

    }

1 个答案:

答案 0 :(得分:0)

使用async的唯一原因是如果您有await的东西。因此,我假设您将使requestForHelpInClient异步并返回一个Task,然后可以await

就这么简单:

public async void RequestForHelp(RequestDetails requestDetails, Location customerClientLocation, int customerClientId)
{
    Customer Customer = Service.CustomerService.GetCustomerById(requestDetails.CustomerId);
    Customer.ClientId = customerClientId;
    Customer.ClientLocation = customerClientLocation;
    requestDetails.Customer = Customer;

    await Clients.User(requestDetails.NearestSupplierList.FirstOrDefault().AspNetUserID).requestForHelpInClient(requestDetails);
}

但是,看到async void时,您总是要认真思考,因为:

  1. 如果发生未处理的异常(读取thisthis),它可能会使您的应用程序崩溃,因此您必须确保在所有内容周围放置try / catch块可能会引发异常,并且
  2. 任何称呼它不能都等到完成为止。

由于第2点,我无法在SignalR上使用async事件处理程序。由于SignalR无法等待您的async方法完成,因此它可能在第一个请求完成之前开始处理另一个请求。这可能对您来说不是问题。

这对我来说是个问题,所以我使事件处理程序保持同步。