定时任中 SqlSugarScope强制线程安全类 - 实验中 返回

SqlSugar 处理完成
4 1402

SqlSugarScope底层是通过AsyncLocal来实现线程安全的

但是在Job中AsyncLocal不会像API一样刷新AsyncLocal

1、db.CopyNew()实现线程安全, 功能100%OK,但是缺点也很明显一些封装方法不能直接db.CopyNew(),只能重写

2、下面是通过强制刷新AsyncLocal实现的,目前还在实验中

//新建一个工具类
public static class AsyncLocalContext
{
      //无返回值 JOB中用这个
    public static Task RunIsolatedAsync(Func<Task> action)
    { 
        using (ExecutionContext.SuppressFlow())
        {
            return Task.Run(action);
        }
    }
    //有返回值
    public static Task<T> RunIsolatedAsync<T>(Func<Task<T>> func)
        {
             using (ExecutionContext.SuppressFlow())
             {
                 return Task.Run(func);
             }
        }

}


Job 或者BackgroudService用法

await AsyncLocalContext.RunIsolatedAsync(async () =>
{   
      //封装的IOC获取Service
   await App.GetService<xxxx>().QueryAsync();
});

测试是不是成功了

 var id = ((SqlSugarScope)db.AsTenant()).ContextID; 
 //定时任务中每次执行Execute方法看这个id是不是变了
 //如果下次执行ID变了说明成功了


热忱回答4

  • fate sta fate sta VIP0
    2025/7/19

    目前还在实验中,大家积极测试。反馈 有没有问题

    0 回复
  • fate sta fate sta VIP0
    2025/7/19

    最后更新时间

    2025年7月19日 13.30分

    0 回复
  • @fate sta:请问这个能正常投入使用了吗?一直受这个问题困扰着

    0 回复
  • fate sta fate sta VIP0
    2025/8/12

    @自由鳥:可以自测

     var id = ((SqlSugarScope)db.AsTenant()).ContextID; 


    如果ID在定时任务中是不一样的就成功的。

    0 回复