实现异步接口同步
本文关键字:同步 接口 异步 实现 | 更新日期: 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
。
同步实现一切,并返回一个已经完成的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;
}
或者更好的是,由于它是一个缓存,您可以缓存任务本身而不是结果,并且每次都返回相同的任务对象。