调用task方法但不等待,task方法内的数据库操作是否需要.copyNew 返回

SqlSugar 沟通中
1 491
该叫什么 发布于2026/2/5
悬赏:0 飞吻

如图,如果我的ExecTaskOneMonth方法外层调用的时候没有await,我当前的方法内的数据库操作是否需要每个_client后面的加.CopyNew()?还是需要 var db=_client.CopyNew();方法内的操作使用db对象?
 _client对象是一个全局静态的sqlSugarScope。image.png

热忱回答1

  • SqlSugarScope 模式 (性能中上)

    只需要看下面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 回复