2015-10-04 30 views
6

Giả sử tôi có giao diện như sau:Thực hiện Async Giao diện đồng bộ

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

tôi có thể thực hiện các nhà cung cấp bộ nhớ cache khác nhau. Tôi thực hiện nó hai lần cho hai lưu trữ khác nhau:

a) redis xanh b) bộ nhớ cache

Đối redis xanh này hoạt động hoàn toàn tốt đẹp kể từ StackExchange.Redis cung cấp tất cả các phương pháp async đối với tôi vì vậy tôi có thể ở lại hoàn toàn async .

Bây giờ tôi thực hiện một số khác cho bộ nhớ cache không cung cấp api không đồng bộ cho tôi. Bây giờ, cách tốt nhất để triển khai giao diện này là gì? Triển khai thực hiện như vậy nhưng chỉ làm mọi thứ đồng bộ hóa? Warp các cuộc gọi nội bộ đến một Task.Run (không phải là một ý tưởng tốt cho các cuộc gọi bộ nhớ cache nhanh mem tôi nghĩ).

+0

Tôi đồng ý với đề xuất của bạn. Ngoài ra, bạn có thể chạy tất cả mọi thứ đồng bộ và trả lại Task.FromResult để làm cho nó trông giống như nó không đồng bộ. – hbulens

Trả lời

5

Quên về Task.Run, không cần phải tải bất kỳ thứ gì xuống số ThreadPool.

Thực hiện tất cả mọi thứ đồng bộ và trả lại đã hoàn thành Task với Task.FromResult khi trả lại một giá trị và Task.CompletedTask khi không:

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

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

Hoặc thậm chí tốt hơn, vì nó là một bộ nhớ cache bạn có thể cache các nhiệm vụ bản thân thay vì kết quả và trả về cùng một đối tượng nhiệm vụ mỗi lần.

+0

Cảm ơn. Okey đó là cách tôi nghĩ. Nhưng Task.CompletedTask là gì? Nó là mới trong .net 4.6 phải không? nó khác với Task.FromResult (0) như thế nào? – LaurinSt

+0

Có, tính năng mới trong .Net 4.6. Nó tốt hơn một chút bởi vì nó trả về cùng một cá thể mỗi lần thay vì phân bổ nhiệm vụ mới cho mỗi cuộc gọi. http://stackoverflow.com/a/26226195/885318 – i3arnon

+0

Cảm ơn bạn rất nhiều. – LaurinSt

Các vấn đề liên quan