缓存未使用DOT NET中的Microsoft.Extensions.Caching.Memory存储

问题描述

我正在使用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);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...