定时任中 SqlSugarScope强制线程安全类 - 实验中 返回
SqlSugar
处理完成
4
1402
悬赏:0 飞吻
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 VIP0
2025/7/19目前还在实验中,大家积极测试。反馈 有没有问题
0 回复 -
fate sta VIP0
2025/7/19最后更新时间
2025年7月19日 13.30分
0 回复 -
自由鳥 VIP0
2025/8/11@fate sta:请问这个能正常投入使用了吗?一直受这个问题困扰着
0 回复 -
fate sta VIP0
2025/8/12@自由鳥:可以自测
varid = ((SqlSugarScope)db.AsTenant()).ContextID;如果ID在定时任务中是不一样的就成功的。
0 回复