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中新增的。它稍微好一点,因为它每次都返回相同的实例,而不是每次调用都分配一个新任务。