【发布时间】:2017-03-15 02:20:24
【问题描述】:
使用不带 async 关键字的 lambda 表达式的 LINQ 表达式可以指定索引。对于example:
var list = FileList.Select((file, index) => new { Index=index, Filename=file });
我试图在使用 async 关键字时获取索引。例如:
await Task.WhenAll(urlList.Select(async url =>
{
byte[] urlContents = await GetWebPageAsync(url);
lock (Locker) { webResults.Add(URLContents); }
}));
我想获取索引的原因是为了可以将网页内容存储在数组中,而不是使用锁定语句或在集合中搜索索引。
当我尝试为上述查询添加索引时,它会给出编译器错误。
有没有办法在上述查询中指定索引,或者是否可以使用另一个支持使用带索引的异步 lambda 表达式的 LINQ 表达式(Select 除外)?
【问题讨论】:
-
你不应该在你的预测中产生副作用。这在普通代码中已经够糟糕了,但是在处理多线程代码时,它就更难处理了。执行投影的 lambda 应该返回操作的结果,而不是将它们添加到列表中。然后,您可以使用返回序列的结果。
标签: c# linq lambda async-await