实现异步接口同步
Implement Async Interface synchronous
假设我有以下界面:
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) 天蓝色的 redis
b) 内存缓存
对于 azure redis,这绝对没问题,因为 StackExchange.Redis 为我提供了所有异步方法,所以我可以保持完全异步。
现在我为内存缓存实现了另一个,它不为我提供异步 api。
现在实现这个接口的最佳实践是什么?
按原样实施但只是让所有内容同步?将内部调用扭曲到 Task.Run
(我认为这对于快速内存缓存调用不是一个好主意)。
忘掉 Task.Run
,无需将任何内容卸载到 ThreadPool
。
同步执行所有内容,return 已经完成 Task
,Task.FromResult
return 一个值,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;
}
甚至更好,因为它是一个缓存,您可以缓存任务本身而不是结果,并且 return 每次都缓存相同的任务对象。
假设我有以下界面:
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) 天蓝色的 redis b) 内存缓存
对于 azure redis,这绝对没问题,因为 StackExchange.Redis 为我提供了所有异步方法,所以我可以保持完全异步。
现在我为内存缓存实现了另一个,它不为我提供异步 api。
现在实现这个接口的最佳实践是什么?
按原样实施但只是让所有内容同步?将内部调用扭曲到 Task.Run
(我认为这对于快速内存缓存调用不是一个好主意)。
忘掉 Task.Run
,无需将任何内容卸载到 ThreadPool
。
同步执行所有内容,return 已经完成 Task
,Task.FromResult
return 一个值,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;
}
甚至更好,因为它是一个缓存,您可以缓存任务本身而不是结果,并且 return 每次都缓存相同的任务对象。