2015-10-04 7 views
6

Angenommen ich habe die folgende Schnittstelle:Async-Schnittstelle Synchron-

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

ich verschiedene Cache-Provider implementieren kann. Ich setzte sie zweimal für zwei verschiedene Caches:

a) azur redis b) Speicher-Cache

Dazu zu redis arbeitet absolut in Ordnung, da StackExchange.Redis bietet all Asynchron-Methoden für mich, so kann ich bleiben vollständig asynchron .

Jetzt implementiere ich eine andere für den Speicher-Cache, die nicht async API für mich bietet. Nun, was ist die beste Praxis, um diese Schnittstelle zu implementieren? Implementieren Sie es wie es ist, aber nur alles synchronisieren? Warp die internen Anrufe zu einem Task.Run (keine gute Idee für schnelle Mem-Cache-Anrufe, denke ich).

+0

Ich stimme Ihrem Vorschlag zu. Alternativ können Sie alles synchron ausführen und Task.FromResult zurückgeben, damit es so aussieht, als wäre es asynchron. – hbulens

Antwort

5

Vergessen Sie über Task.Run, es gibt keine Notwendigkeit, etwas auf die ThreadPool zu entladen.

Implementieren alles synchron und zurück ein bereits fertig Task mit Task.FromResult wenn Wert und Task.CompletedTask zurückkehrt, wenn nicht:

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

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

Oder noch besser, da es ein Cache Sie die Aufgaben-Cache können sich statt der Ergebnisse und Immer dasselbe Aufgabenobjekt zurückgeben.

+0

Danke. Okey, das war die Art, wie ich es vermutete. Aber was ist Task.CompletedTask? Es ist neu in .net 4.6 oder? Wie unterscheidet es sich von Task.FromResult (0)? – LaurinSt

+0

Ja, es ist neu in .Net 4.6. Es ist etwas besser, weil es jedes Mal dieselbe Instanz zurückgibt, anstatt jedem Aufruf eine neue Aufgabe zuzuweisen. http://stackoverflow.com/a/26226195/885318 – i3arnon

+0

Vielen Dank. – LaurinSt