调用task方法但不等待,task方法内的数据库操作是否需要.copyNew 返回
如图,如果我的ExecTaskOneMonth方法外层调用的时候没有await,我当前的方法内的数据库操作是否需要每个_client后面的加.CopyNew()?还是需要 var db=_client.CopyNew();方法内的操作使用db对象?
_client对象是一个全局静态的sqlSugarScope。
热忱回答(1)
-
fate sta VIP0
2026/2/5SqlSugarScope 模式 (性能中上)
只需要看下面3条就行了,100%覆盖所有场景
排查1:异步方法wait存在漏写, 一个不能少 。解决方案:找到漏掉的await 建议补上遗漏的await,如果不想补就用db.CopyNew()。
排查2:使用await 返回值必须有Task,不能是Void 这种(表达式中异步只能是Func<Task>不能是Action<X> ,比如List.Forech就是Action要改普通forech) 建议改代码,如果不想修改 db改成db.CopyNew()解决
排查3:Task.WhenAll 、 ParallelAsync 和 第三方定时任务库 Job (backgroundservice也算) 使用 db.CopyNew()
方式1: 强制刷新AsyncLocal实现线程安全 点击查看 (优点支持仓储和封装代码)
方式2:db.CopyNew()强制线程安全,缺点不适合仓储和封装代码
CopyNew只有定时任务和Task.WhenAll 第3项必要需要加其他只要代码写对就不需要加
CopyNew要当前业务方法用,不能赋值全局变量,避免写到公用方法(会破坏事务会有问题)
CopyNew如果要用事务看3.1
多租户要用db.CopyNew().GetConnection方法(不能用GetConnectionScope)
0 回复