- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将 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/
我创建了一个名为“VIAlarmManager”的类,并在其中创建了一个 AlarmManager 并设置了一些属性。但无论如何,警报都没有被触发,我做错了什么吗?我尝试调用一个在给定间隔(例如 1
我有一个自定义接收器,可以在安装应用程序时处理 INSTALL_REFERRER Intent 。它在测试期间被调用了一两次,但现在根本没有被调用。我正在使用模拟器进行测试,并已完成 this tes
我正在构建一个出租车预订应用程序,我需要每 20 秒获取一次出租车的当前位置。 我已经定义了一个 AlarmManager 并需要它每 20 秒重复一次。但它不会定期重复。相反,它在 233 秒后重复
我构建了一个聊天应用程序。它工作正常。两个用户都可以轻松聊天但是我遇到问题的地方是,如果一个用户的应用程序处于后台并且屏幕关闭,则无法通知用户收到该消息。 我现在想要的是在我的应用程序中,当 user
我将 SignalR 2.0.1 与 PersistentConnection(不是集线器)一起使用,目前我默认的非常简单的 OnReceived 处理程序如下所示: protected overri
我是一名优秀的程序员,十分优秀!