【问题标题】:async/await with signalr hub methods带有信号器集线器方法的异步/等待
【发布时间】:2019-11-13 09:40:42
【问题描述】:

所以我已经开始为“x”应用程序开发 uber。与优步相同的概念。以下代码是我的 Signalr hub 上的代码。我使用信号器在客户端和服务器之间进行通信。因此,当客户端请求帮助时,它会连接到 RequestForHelp。然后 RequestForHelp 将请求发送回正确的供应商。根据供应商的回答,HelpResponseYes HelpResponseNo 被调用。我想让它成为异步的。我想让请求帮助成为一项任务。因此,当我单击请求按钮时,程序会等待。有什么建议吗?

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     

    }

【问题讨论】:

  • 让你的方法异步,然后使用configureAwait(true)
  • 你能告诉我怎么做吗? @Kiril1512

标签: c# asynchronous async-await signalr


【解决方案1】:

使用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 方法完成,它可能会在第一个请求完成之前开始处理另一个请求。这对你来说可能是也可能不是问题。

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

【讨论】:

  • 是的,这对我来说是个问题。那我能做什么?当客户端请求帮助时,我想“禁用”(但有一条消息说“请求已发送,等待响应”)客户端页面,直到请求得到答复。你有什么想法吗?
  • 您可以使用Clients.Caller.Whatever()(其中Whatever() 是您定义的客户端方法)向发起您当前正在处理的呼叫的人发送消息。您可以阅读有关此内容和其他选项的信息here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多