实现异步接口同步

Lau*_*nSt 9 .net c# task-parallel-library async-await

假设我有以下界面:

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();
}
Run Code Online (Sandbox Code Playgroud)

我可以实现不同的缓存提供者.我为两个不同的缓存实现了两次:

a)azure redis b)内存缓存

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

现在我为内存缓存实现了另一个,它不为我提供异步api. 现在实现这个界面的最佳实践是什么? 按原样实现,但只是做一切同步?将内部调用变为a Task.Run(我认为快速mem缓存调用不是一个好主意).

i3a*_*non 9

忘记了Task.Run,没有必要卸载任何东西ThreadPool.

同步实现所有内容并在返回值时返回已完成的内容Task,Task.FromResult何时不返回Task.CompletedTask:

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

Task RemoveAsync(string key)
{
    Remove(key);
    return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)

甚至更好,因为它是一个缓存,您可以自己缓存任务而不是结果,并且每次都返回相同的任务对象.