当前位置:  开发笔记 > 编程语言 > 正文

C#等待问题

如何解决《C#等待问题》经验,为你挑选了1个好方法。

documentsIDictionary参数的位置

DocumentHandler.Download() 返回一个 Task

此代码有效:

foreach (var x in documents.Keys)
    {
        var result = await DocumentHandler.Download(new Uri(documents[x]));
        // other code
    }

然而它同步发展.

为了运行它所有async我写了这段代码:

var keys =
documents.Keys.Select(async x =>
    {
        return Tuple.Create(x, await DocumentHandler.Download(new Uri(documents[x])));
    });
await Task.WhenAll(keys);
foreach (var item in keys)
{
    var tpl = item.Result;
    // other code
}

它不起作用,它崩溃而没有在最后一行显示异常var tpl = item.Result;为什么?



1> Jon Skeet..:

每次评估时,您的keys变量都会创建一组任务...因此,在等待第一组任务完成后,您将迭代一组新的未完成任务.对此的简单修复是添加一个调用ToList():

var keys = documents
    .Keys
    .Select(async x => Tuple.Create(x, await DocumentHandler.Download(new Uri(documents[x]))))
    .ToList();
await Task.WhenAll(keys);
foreach (var item in keys)
{
    var tpl = item.Result;
    // other code
}

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有