Преглед изворни кода

1.解决使用异步方法时报错 does not contain a definition for 'DynamicInvokeAsync 的问题
2.AdGetAsync 方法:
传入的expiry参数未实际应用;
在每次从缓存获取值的时候不重新Set,避免无限的获取就无限的延长缓冲有效时间;
对于参数 objs 长度是0的时候,key 最后不加多余的冒号

问题1的重现问题方法:

public async Task<TestTable> GetrecordBytestTableCode(string testTableCode)
{
var record = await _sysCacheService.AdGetAsync<TestTable>(testTableCode, async () => {
var records = await _testTableService.GetrecordListBytestTableCode(testTableCode);
// ..... 其他一些处理 ........

return records.FirstOrDefault();
}, new TimeSpan(0,30,0)); //按照30分钟的缓存期

return record;
}

hwj пре 8 месеци
родитељ
комит
fec4ea7f77
1 измењених фајлова са 20 додато и 6 уклоњено
  1. 20 6
      Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs

+ 20 - 6
Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs

@@ -108,8 +108,18 @@ public class SysCacheService : IDynamicApiController, ISingleton
         using (_cacheProvider.Cache.AcquireLock($@"lock:AdGetAsync:{cacheName}", 1000))
         {
             var value = Get<T>(key);
-            value ??= await ((dynamic)del).DynamicInvoke(obs);
-            Set(key, value);
+            if (value == null)
+            {
+                value = await ((dynamic)del).DynamicInvoke(obs);
+                if (expiry == null)
+                {
+                    Set(key, value);
+                }
+                else
+                {
+                    Set(key, value, (TimeSpan)expiry);
+                }
+            }
             return value;
         }
     }
@@ -131,15 +141,19 @@ public class SysCacheService : IDynamicApiController, ISingleton
 
     private T Get<T>(String cacheName, Object[] obs)
     {
-        var key = cacheName + ":" + obs.Aggregate(string.Empty, (current, o) => current + $"<{o}>");
+        var key = Key(cacheName, obs);
         return Get<T>(key);
     }
 
     private static string Key(string cacheName, object[] obs)
     {
-        if (obs.OfType<TimeSpan>().Any()) throw new Exception("缓存参数类型不能能是:TimeSpan类型");
-        StringBuilder sb = new(cacheName + ":");
-        foreach (var a in obs) sb.Append($"<{KeySingle(a)}>");
+        if (obs.OfType<TimeSpan>().Any()) throw new Exception("缓存参数类型不能是:TimeSpan类型");
+        StringBuilder sb = new(cacheName);
+        if (obs is { Length: > 0 })
+        {
+            sb.Append(':');
+            foreach (var a in obs) sb.Append($"<{KeySingle(a)}>");
+        }
         return sb.ToString();
     }