小编Pal*_*ris的帖子

使用 IMemoryCache 缓存结果 Task<T> 的正确方法

我正在研究一种包装调用远程 WCF 服务以获取某些数据的服务的方法。例如,这样的服务可能看起来像这样

public interface IAsyncSvc
{
    Task<int[]> GetData(int key);
}

public class SomeAsyncSvc:IAsyncSvc
{
    public Task<int[]> GetData(int key)
    {
        Console.WriteLine("SomeAsyncSvc::GetData()");
        return Task.Factory.StartNew(() =>
        {
            //Some time-consuming operation
            Thread.Sleep(1000);
            return Enumerable.Range(1, key).ToArray();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我第一次编写了一个简单的缓存包装器:

public class SomeAsyncSvcCachedTask : IAsyncSvcCached
{
    private readonly IAsyncSvc _svc;
    private readonly IMemoryCache _cache;

    public SomeAsyncSvcCachedTask(IAsyncSvc svc, IMemoryCache cache)
    {
        _svc = svc;
        _cache = cache;
    }

    public Task<int[]> GetData(int v)
    {
        if (_cache.TryGetValue(v, out Task<int[]> cacheEntry))
            return cacheEntry;

        var task = _svc.GetData(v);
        var …
Run Code Online (Sandbox Code Playgroud)

.net c# caching asynchronous

5
推荐指数
1
解决办法
1221
查看次数

标签 统计

.net ×1

asynchronous ×1

c# ×1

caching ×1