我正在尝试异步地填充我的缓存
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) {....}
但是这给了我一个错误:
无法将异步 lambda 表达式转换为委托类型 "System.Func"。
异步 lambda 表达式可能返回 void、Task 或 Task<T>,其中没有任何一种可转换为 "System.Func"。
据我所知,这是因为 GetOrAdd()
不是异步的。我该如何解决这个问题?
更新:评论区中建议使用LazyAsync
,这在我的简单示例中可以工作。或者,像这样的解决办法(可以接受它引入的一些开销):
public static async Task<string[]> GetStuffAsync(string key)
{
string[] d = null;
if (!data.ContainsKey(key))
d = await LoadAsync(key);
return data.GetOrAdd(key, d);
}
问题是,微软是否没有时间更新所有接口以支持异步,还是我在做一些深层次的错误尝试(ConcurrentDictionary
不应该有 GetOrAddAsync()
)?
await
只在异步层之间起作用,而你缺少了一个 -GetOrAdd
方法本身。你需要一个自己本身就是异步的版本,并等待整个GetOrAdd
方法(注意,你现在实际上并没有这样做 - 这是另一个问题)。不幸的是,这意味着要编写自己的ConcurrentDictionary,这会很痛苦。 - LuaanGetStuffAsync
版本2上多做一些工作,使其线程安全,那应该就没问题了。 - Sriram Sakthivel