首页 新闻 会员 周边

NetCore Websocket 数据库上下文被两个线程访问

0
悬赏园豆:60 [已解决问题] 解决于 2021-08-05 20:36

Websocket中使用ReceiveAsync方法读取到数据流后访问Service层,然后做出相应的业务逻辑,但是由于Websocket的生命周期和普通HTTP请求不同,同一个Websocket连接用的是同一个Service层方法,如果一次快速收到一个用户的两条请求,就会提示DBContext被两个线程同时访问。

A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.”

Dbcontext注入的为Scoped,Service注入的为Transient

叫我昆哥哥的主页 叫我昆哥哥 | 初学一级 | 园豆:60
提问于:2021-08-03 00:19
< >
分享
最佳答案
0

private IServiceProvider _services; 注入

using (var scope = _services.CreateScope())
{
var services = scope.ServiceProvider;
var _userService = services.GetService<IUserService>();
}

收获园豆:60
diudiu1 | 小虾三级 |园豆:1031 | 2021-08-03 08:49

妈呀, 我看出dudu1 了

永远跟党走i | 园豆:1519 (小虾三级) | 2021-08-03 08:57

这样做确实可以不报错了,但是每次都会生成一个IUserService实例,没有被释放掉,每一次访问内存占用会增加,怎么样才可以让该实例自动销毁

叫我昆哥哥 | 园豆:60 (初学一级) | 2021-08-03 10:05

@叫我昆哥哥: 手动释放呗

flyfishing | 园豆:943 (小虾三级) | 2021-08-05 20:33
其他回答(1)
0

是不是 有异步操作DBContext ?这个和 Websocket 没什么关系吧

gt1987 | 园豆:1150 (小虾三级) | 2021-08-05 10:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册