0
点赞
收藏
分享

微信扫一扫

记一次.NetCore 使用EFCore DbContext异常

系统两天前上线正式环境,上线之前通过dev和uat环境测试。

但是还是担心会有问题,盯着日志看,发现了一段话:System.InvalidOperationException: A second operation started on this context before a previous operation completed. This is usually caused by different threads using the same instance of DbContext. For more information on how to avoid threading issues with DbContext。

看这个错误,第一时间就是想到,异步方法使用不当。于是去翻代码,发现另一个同事写的异步方法的签名使用了async,但是都没有配合使用Task类型而是直接async void,甚至有些同步方法调用异步方法直接.wait()或者.Result()。看到这里我两眼一黑,同时被领导叼了一顿。

async await 语法糖处理异步调度,是使用线程池自动调度,而不是每一个异步等待都会创建线程。但是使用时一定要记得是成对出现且需要签名使用Task或Task<T>作为返回值类型。这样线程池遇到需要等待的地方会自动调度线程执行。

另外,同步执行异步方法,不是.Wait()也不是.Result(),如果这样使用,在你不知道的地方就会造成死锁。所以正确的使用方式应该是.GetAWait().GetResult().

修复代码,重新上线后,问题没有出现了。但仍需观察。


举报

相关推荐

0 条评论