2015-10-04 165 views
6

假设我有以下接口:实现异步接口同步

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

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

一)蔚蓝的Redis B)内存缓存

为天青Redis的这个工作绝对没问题,因为StackExchange.Redis提供一切对我来说是异步方法,所以我可以留下来完全异步。

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

+0

我同意你的建议。或者,您可以同步运行所有内容并返回Task.FromResult,使其看起来像是异步的。 – hbulens

回答

5

忘掉Task.Run,没有必要将任何东西卸载到ThreadPool

同步实现的一切,并返回一个已经完成的返回值时TaskTask.FromResultTask.CompletedTask时不:

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

Task RemoveAsync(string key) 
{ 
    Remove(key); 
    return Task.CompletedTask; 
} 

甚至更​​好,因为它是一个高速缓存可以缓存任务本身,而不是结果每次都返回相同的任务对象。

+0

谢谢。奥基,这是我想的方式。但什么是Task.CompletedTask?它在.net 4.6中是新的吗?它与Task.FromResult(0)有什么不同? – LaurinSt

+0

是的,它是.NET 4.6中的新功能。它稍微好一些,因为它每次都返回相同的实例,而不是每次调用都分配一个新任务。 http://stackoverflow.com/a/26226195/885318 – i3arnon

+0

非常感谢。 – LaurinSt