问题描述
我正在使用Microsoft Extensions Caching Memory,但它不在高速缓存上存储数据。 我的代码:
public class MyMemoryCache<TItem>
{
private MemoryCache _cache = new MemoryCache(new MemoryCacheOptions());
private ConcurrentDictionary<object,SemaphoreSlim> _locks = new ConcurrentDictionary<object,SemaphoreSlim>();
public async Task<List<TItem>> GetorCreate(object key,List<TItem> createItem)
{
List<TItem> cacheEntry;
if (!_cache.TryGetValue(key,out cacheEntry))
{
SemaphoreSlim mylock = _locks.GetorAdd(key,k => new SemaphoreSlim(1,1));
await mylock.WaitAsync();
try
{
if (!_cache.TryGetValue(key,out cacheEntry))
{
// Key not in cache,so get data.
cacheEntry = createItem;
_cache.Set(key,cacheEntry);
}
}
finally
{
mylock.Release();
}
}
return cacheEntry;
}
}
实施
IsqlQueries query = new sqlQueries();
var _openCases = new MyMemoryCache<MyListDTO>();
var openedCases = _openCases.GetorCreate("GetMyInfo",query.displaydata()).Result;
public List<MyListDTO> displayData()
{
httpclienthandler hch = new httpclienthandler();
hch.Proxy = null;
hch.UseProxy = false;
var client = new HttpClient(hch);
var result = client.GetAsync(url,HttpCompletionoption.ResponseHeadersRead).Result;
}
我能够从服务器成功检索数据,但是由于缺少缓存存储,它一直在调用服务器。我所缺少的,谢谢。
解决方法
我将这样更改代码:
public async Task<List<TItem>> GetOrCreate(object key,Func<Task<List<TItem>>> createItem)
{
List<TItem> cacheEntry;
if (!_cache.TryGetValue(key,out cacheEntry))
{
SemaphoreSlim mylock = _locks.GetOrAdd(key,k => new SemaphoreSlim(1,1));
await mylock.WaitAsync();
try
{
if (!_cache.TryGetValue(key,out cacheEntry))
{
// Key not in cache,so get data.
cacheEntry = await createItem(); // will only actually fetch data
// on cache miss
_cache.Set(key,cacheEntry);
}
}
finally
{
mylock.Release();
}
}
return cacheEntry;
}
用法:
var openedCases = await _openCases.GetOrCreate("GetMyInfo",() => query.Displaydata());
查询:
public async Task<List<MyListDTO>> DisplayData()
{
HttpClientHandler hch = new HttpClientHandler();
hch.Proxy = null;
hch.UseProxy = false;
var client = new HttpClient(hch);
// ^^ Please do NOT create new HttpClients all the time.
return await client.GetAsync(url,HttpCompletionOption.ResponseHeadersRead);
}