实现异步接口同步

本文关键字:同步 接口 异步 实现 | 更新日期: 2023-09-27 18:15:59

假设我有以下接口:

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();
}

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

a) azure redisB)内存缓存

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

现在我实现另一个内存缓存不提供异步api为我。现在实现这个接口的最佳实践是什么?实现它是,但只是做一切同步?将内部调用扭曲到Task.Run(我认为对于快速内存缓存调用不是一个好主意)。

实现异步接口同步

忘掉Task.Run吧,没有必要把任何东西卸载给ThreadPool

同步实现一切,并返回一个已经完成的TaskTask.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;
}

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