2015-10-04 106 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