如何将索引添加到异步LINQ查询

时间:2017-03-14 17:19:38

标签: c# linq lambda async-await

使用不带async关键字的lambda表达式的LINQ表达式可以指定索引。对于example

for zed in range(1,6):
    empty = '\t'
    for k in range(6):

我正在尝试使用async关键字获取索引。例如:

var list = FileList.Select((file, index) => new { Index=index, Filename=file });

我想获取索引的原因是网页内容可以存储在数组中,而不是使用锁定语句或在集合中搜索索引。

当我尝试向上述查询添加索引时,它会给编译器错误。

有没有办法在上面的查询中指定索引,还是可以使用另一个支持使用带索引的异步lambda表达式的LINQ表达式(除Select之外)?

1 个答案:

答案 0 :(得分:0)

我刚刚意识到代码在从await返回时将始终是单线程的 - 并且它将始终位于调用它的同一线程上。在这种情况下,它是一个用户界面线程。因此,不需要锁定声明。

为了验证这一点,我进行了一些调用以获取线程ID:

string ThreadID = Thread.CurrentThread.ManagedThreadId.ToString();
await Task.WhenAll(urlList.Select(async url =>
{
   string TaskThreadID = Thread.CurrentThread.ManagedThreadId.ToString();
   byte[] URLContents = await GetWebPageAsync(url);
   string TaskThreadID2 = Thread.CurrentThread.ManagedThreadId.ToString();
   lock (locker) { webResults.Add(URLContents); }
     }));

它们都是相同的价值。我对Task.WhenAll方法的工作方式存在误解。

即使在这种情况下我不需要索引,但有时它会有所帮助。如果有人能够展示如何优雅地获得索引,我将接受答案。