gpt4 book ai didi

c# - 在 SignalR 2.0 OnReceived 处理程序中调用 await 的正确方法

转载 作者:行者123 更新时间:2023-12-03 19:30:16 25 4
gpt4 key购买 nike

我将 SignalR 2.0.1 与 PersistentConnection(不是集线器)一起使用,目前我默认的非常简单的 OnReceived 处理程序如下所示:

protected override Task OnReceived(IRequest request, string connectionId, string data)
{
return Connection.Broadcast(data);
}

我想向这个处理程序添加一些 I/O 绑定(bind)代码,比如访问不同机器上的数据库。当然,我希望一切都是异步的,我不想阻塞线程,所以我希望使用像 EF6 的 db.SaveChangesAsync() 这样的异步风格(而不是常规的阻塞 db.SaveChanges).

我将 db.SaveChangesAsync() 添加到处理程序,但我也需要对其进行 await。所以我还向处理程序添加了一个 async 修饰符,但这导致我的返回值出错 - 我不能再返回 Connection.Broadcast(data) 了。

这是我最终得到的:

protected override async Task OnReceived(IRequest request, string connectionId, string data)
{
// some EF code here..

await db.SaveChangesAsync();

// the original return changes into this?
await Connection.Broadcast(data);
}

这是执行此操作的正确方法吗?因为我有一种感觉,我在滥用模式。


顺便说一句,如果我没理解错的话,当前版本的 SignalR 是完全异步的。像描述的那样的旧版本 here有两个处理程序 - 一个同步处理程序和一个异步处理程序(使用 Async 后缀)。

最佳答案

是的,这是一种非常合理的处理方式。为什么您觉得您可能在滥用该模式?

这样想:

  • 一个返回void的同步方法对应于返回 Task 的异步方法.同样,
  • 一个返回T的同步方法对应于返回 Task<T> 的异步方法.

这就是为什么你不能这样做

protected override async Task OnReceived(IRequest request, string connectionId, string data)
{
return Connection.Broadcast(data);
}

,自 async关键字和您的 return 语句将指示返回 Task<Task> 的方法.

您可以做的是删除最后一个 await共。它所做的只是创建一个空的延续(因为它本质上是在说“广播完成后,在广播之后运行代码,直到结束花括号”)。或者,如果您愿意,可以保留它以保持一致性。

关于c# - 在 SignalR 2.0 OnReceived 处理程序中调用 await 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23114175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com