C# 实现异步接口同步

C# 实现异步接口同步,c#,.net,async-await,task-parallel-library,C#,.net,Async Await,Task Parallel Library,假设我有以下接口: public interface IApiOutputCache { Task RemoveStartsWithAsync(string key); Task<T> Get<T>(string key) where T : class; Task RemoveAsync(string key); Task<bool> ContainsAsync(string key); Task Add(string

假设我有以下接口:

public interface IApiOutputCache
{
    Task RemoveStartsWithAsync(string key);
    Task<T> Get<T>(string key) where T : class;
    Task RemoveAsync(string key);
    Task<bool> ContainsAsync(string key);
    Task Add(string key, object o, DateTimeOffset expiration, params string[] dependsOnKeys);
    Task<IEnumerable<string>> GetAllKeys();
}
公共接口IApiOutputCache
{
任务RemoveStartsWithAsync(字符串键);
任务Get(字符串键),其中T:class;
任务RemoveAsync(字符串键);
任务包含同步(字符串键);
任务添加(字符串键、对象o、日期时间偏移过期、参数字符串[]dependsOnKeys);
任务GetAllKeys();
}
我可以实现不同的缓存提供程序。我为两个不同的缓存实现了两次:

a) azure redis b) 内存缓存

对于azure redis来说,这是非常好的,因为StackExchange.redis为我提供了所有异步方法,所以我可以保持完全异步

现在我为内存缓存实现了另一个,它不为我提供异步api。 现在实现此接口的最佳实践是什么?
按原样实现,但只是同步所有内容?将内部调用扭曲到
任务。运行
(我认为这不是快速mem缓存调用的好主意)。

忘记
任务。运行
,无需将任何内容卸载到
线程池

同步执行所有操作,并返回已完成的
任务
,返回值时返回
任务。返回值时返回FromResult
,返回值时返回
任务。未返回时返回CompletedTask

Task<T> GetAsync<T>(string key)
{
    T result = Get(key);
    return Task.FromResult(result);
}

Task RemoveAsync(string key)
{
    Remove(key);
    return Task.CompletedTask;
}
Task GetAsync(字符串键)
{
T结果=获取(键);
返回Task.FromResult(结果);
}
任务RemoveAsync(字符串键)
{
取下(钥匙);
返回Task.CompletedTask;
}

或者更好,因为它是一个缓存,所以您可以缓存任务本身而不是结果,并且每次都返回相同的任务对象

我同意你的建议。或者,您可以同步运行所有内容并返回Task.FromResult,使其看起来像是异步的。谢谢。好吧,我就是这么想的。但什么是Task.CompletedTask?它在.NET4.6中是新的,对吗?它与Task.FromResult(0)有何不同?是的,它是.NET4.6中新增的。它稍微好一点,因为它每次都返回相同的实例,而不是每次调用都分配一个新任务。