使用LINQ和异步方法填充字典

6
我正在尝试填写 Dictionary<long, Data>。方法 GetData 返回数据是异步的,因此我使用以下代码获取字典:
var myDictionary = entities
  .GroupBy(e => e.EntityId)
  .Select(e => e.First())
  .ToDictionary(e => e.EntityId, async entity => await GetData(entity));

很遗憾,我的字典是Dictionary<long, Task<Data>>类型的。

如何使用异步lambda表达式在ToDictionary中填充它?


最简单但可能不正确的解决方法是使用GetData(entity).GetAwaiter().Result,因为这只是强制所有异步操作同步执行。但是,在LINQ或PLINQ中都没有支持以正确方式异步构建集合(据我所知)。 - Jeroen Mostert
@JeroenMostert:是的,但我失去了所有异步/等待的好处。 - michal.jakubeczy
你需要使用.ToDictionaryAsync,但是除了EF之外,这种方法并不存在(即使在EF中,它也不是完全通用的版本)。重复问题,尽管没有真正好的答案。 - Jeroen Mostert
1个回答

4

试试这个:

var myDictionary = 
                (await Task.WhenAll(entities
                .GroupBy(e => e.EntityId)
                .Select(e => e.First())
                .Select(async e => new {e.EntityId, Data = await GetData(e)})))
                  .ToDictionary(e => e.EntityId, e => e.Data);

GetData返回Task<Data>,因此它返回Dictionary<long,Task<Data>>。 - michal.jakubeczy
我曾经认为,这个部分是用来回答问题的,而不是提问的。 ;) - Rand Random
难道不是想要一个Dictionary<long,Task<Data>>吗?还是我理解错了? - Magnus
@Servy “极其糟糕”,拜托了… - Magnus
@Magnus,发布一个错误的解决方案并复制早期发布的解决方案如何帮助任何人?请注意,这是一个创建有用知识库的网站,而不是帮助台。 - Servy
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接