Tôi đang cố gắng để cư trú bộ nhớ cache của tôi không đồng bộasync cuộc gọi trong phạm vi chức năng đồng bộ
static ConcurrentDictionary<string, string[]> data = new ConcurrentDictionary<string, string[]>();
public static async Task<string[]> GetStuffAsync(string key)
{
return data.GetOrAdd(key, async (x) => {
return await LoadAsync(x);
});
}
static async Task<string[]> LoadAsync(string key) {....}
nhưng điều này mang lại cho tôi những lỗi:
Cannot convert async lambda expression to delegate type 'System.Func'.
An async lambda expression may return void, Task or Task, none of which are convertible to 'System.Func'.
Như tôi hiểu điều này là bởi vì GetOrAdd()
không phải là không đồng bộ. Làm cách nào để khắc phục sự cố?
Cập nhật: LazyAsync
gợi ý trong các ý kiến sẽ làm việc trong ví dụ tầm thường của tôi. Hoặc, workaround như thế này (chắc chắn có thể sống chung với một số phí nó giới thiệu):
public static async Task<string[]> GetStuffAsync(string key)
{
string[] d = null;
if (!data.ContainsKey(key))
d = await LoadAsync(key);
return data.GetOrAdd(key, d);
}
Câu hỏi đặt ra sau đó trở nên đã làm Microsoft chỉ không có thời gian để cập nhật tất cả các giao diện để hỗ trợ async hay tôi đang cố gắng để làm một cái gì đó sâu sắc sai (và ConcurrentDictionary
không nên có GetOrAddAsync()
)?
không phải là câu trả lời, nhưng có thể thú vị cho bạn: bạn đã thấy [AsyncLazy] (http://blogs.msdn.com/b/pfxteam/archive/2011/01/15/10116210.aspx) chưa? – Default
Vâng, bạn không thể làm điều đó bằng cách sử dụng giao diện bạn có. 'await' chỉ hoạt động khi nó trên các lớp không đồng bộ, và bạn đang thiếu một - phương thức' GetOrAdd'. Bạn sẽ cần một phiên bản không đồng bộ, và chờ toàn bộ phương thức 'GetOrAdd' (lưu ý cách bạn không thực sự làm điều đó ngay bây giờ - đó là một vấn đề khác). Đáng buồn thay, điều này có nghĩa là viết ConcurrentDictionary của riêng bạn, điều này sẽ gây tổn thương. – Luaan
Tại sao 'ConcurrentDictionary' có' GetOrAddAsync'? Nó là một bộ sưu tập bộ nhớ đồng bộ. Không có lý do gì để nó có một phương pháp như vậy. –