异步下载多个文件并等待所有文件完成,然后再执行其余代码

2023-12-22

我正在尝试从互联网下载多个文件并等待所有文件完成。这是我正在运行的 C# 控制台应用程序,因此不需要进度条事件处理程序。然而,即使所有文件尚未下载,它目前也只是继续执行代码。

  • 1.下载所有文件!
  • 2.完成下载文件A
  • 3.所有文件下载完毕!
  • 4.文件B下载完成
  • 5.C文件下载完成

您将如何等待所有异步下载文件完成。

 private void DownloadMultipleFiles(List<DocumentObject> doclist)
    {
        foreach(var value in doclist){
            try
            {
                using (WebClient webClient = new WebClient())
                {
                    string downloadToDirectory = @Resources.defaultDirectory + value.docName;
                    webClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
                    webClient.DownloadFileCompleted += client_DownloadFileCompleted;
                    webClient.DownloadFileAsync(new Uri(value.docUrl), @downloadToDirectory);

                    //Add them to the local
                    Context.listOfLocalDirectories.Add(downloadToDirectory);
                }         
            }
            catch (Exception)
            {
                Errors.printError("Failed to download File: " + value.docName);
            }
        }
    }

The DownloadFileAsync/DownloadFileCompleted的成员WebClient使用基于事件的异步模式 http://msdn.microsoft.com/en-us/library/ms228969.aspx。如果你想使用async and await,你应该使用基于任务的异步模式 http://msdn.microsoft.com/en-us/library/hh873175.aspx.

在这种情况下,您应该使用DownloadFileTaskAsync member http://msdn.microsoft.com/en-us/library/hh193917.aspx, 像这样:

private async Task DownloadFileAsync(DocumentObject doc)
{
  try
  {
    using (WebClient webClient = new WebClient())
    {
      string downloadToDirectory = @Resources.defaultDirectory + doc.docName;
      webClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
      await webClient.DownloadFileTaskAsync(new Uri(doc.docUrl), @downloadToDirectory);

      //Add them to the local
      Context.listOfLocalDirectories.Add(downloadToDirectory);
    }         
  }
  catch (Exception)
  {
    Errors.printError("Failed to download File: " + doc.docName);
  }
}

private async Task DownloadMultipleFilesAsync(List<DocumentObject> doclist)
{
  await Task.WhenAll(doclist.Select(doc => DownloadFileAsync(doc)));
}

请注意,您的Context.listOfLocalDirectories.Add and Errors.printError方法应该是线程安全的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步下载多个文件并等待所有文件完成,然后再执行其余代码 的相关文章

随机推荐

  • 循环从节点 Promise 返回的对象并提供给下一个 .then

    我似乎永远被这个问题困扰了 我刚刚进入节点 并开始思考承诺等 我想做的是从 Spotify API 获取数据 我做的第一件事就是获取我自己的播放列表 function getPlaylists access token var option
  • 如何使用 jQuery 从文件添加内容?

    我有主要的html文档 div div 我还有一个内容文件 不是 html 文档 只是 html 代码 div class CodeRay div class code pre span class no 1 span require pr
  • 神经网络初始化 - Nguyen Widrow 实现?

    我尝试过实现 Nguyen Widrow 算法 如下 它似乎运行正常 但我有一些后续问题 这看起来像一个正确的实现吗 Nguyen Widrow 初始化是否适用于任何网络拓扑 尺寸 即5层自动编码器 Nguyen Widrow 初始化对任何
  • 性能和耐久性存储API(块存储)

    我们是 DST India 团队的一员 目前我们正在为客户提供一项产品 我们尝试使用 SoftLayer 提供的 REST API 将 SoftLayer 的性能和耐用存储功能集成到 ICO 中 我已经浏览了 SoftLayer 文档 但找
  • 在电子邮件中附加多种图像格式,而不仅仅是 JPG

    这就是我到目前为止所拥有的 MemoryStream imgStream new MemoryStream System Drawing Image img System Drawing Image FromStream fuImage P
  • 如何在Python中连接字符串和数字? [复制]

    这个问题在这里已经有答案了 我试图在Python 中连接一个字符串和一个数字 当我尝试这样做时 它给了我一个错误 abc 9 错误是 Traceback most recent call last File
  • HashMap 和 int 作为键

    我正在尝试构建一个 HashMap 它将整数作为键 将对象作为值 我的语法是 HashMap
  • Win2008 R2 上的 MSMQ 不会接收来自旧客户端的消息

    我在这里遇到一个非常奇怪的问题 我有一台安装了消息队列的 Windows 2008 R2 服务器 在另一台计算机上 运行 Windows 2003 的服务被设置为将消息发送到 2008 服务器上的公共队列 但是 消息永远不会显示在服务器上
  • 视频文件的下载链接

    我有一个视频想要提供下载链接 然而 创建了一个简单的 a href myvideo mp4 Download a 标签 当我点击它 在 Firefox 和 Chrome 中 时 它开始播放视频而不是允许下载视频 有没有一种方法可以在所有当前
  • 在 PHP 中如何不允许用户在注销后返回?

    我刚刚编写了一个PHP登录脚本 我想要完成的是 当用户单击注销链接时 在注销后 无论单击浏览器的后退按钮 他们都无法访问该页面 这是注销功能 Start the Session session start session destroy h
  • 如何在 DTrace 操作中打印 CFStringRef?

    我有一个 DTrace 探针捕获对函数的调用 该函数的参数之一是CFStringRef 这是保存指向 unicode 字符串的指针的私有结构 但是CFStringRef本身不是一个char 所以普通的 DTrace 方法如copyinstr
  • 使用 xdebug 和 netbeans 调试 php-cli 脚本?

    我已设法从 IDE 本身启动 php cli 脚本调试会话 但我需要从 shell 命令行启动调试会话 这些是相当复杂的维护 PHP 脚本 需要大量输入参数 因此从 Netbeans 中输入参数有点麻烦 我之前用 Zend studio 做
  • XML 模式中的递归?

    我需要创建一个 XML 模式来验证 XML 文档的树结构 我不确切知道树的出现次数或深度级别 XML 示例
  • CPython 源 - 如何构建静态 python26.lib?

    我正在尝试使用 Cython 将 hello pyx 文件编译为 exe 第一步是使用命令 cython cplus embed hello pyx 将 hello pyx 编译为 hello cpp 文件 Embed选项意味着Genera
  • Sublime Text - 选择最后一个增量选择的元素?

    I recently discovered the insanely useful ctrl D functionality in sublime text With a careful eye it s almost as functio
  • AngularJS ng-model 的默认值

    是否可以使 ng models 获得默认值 例如 我有一个使用了 jQuery 的表单serialize函数 每当 a 值不存在时 它仍然会将其包含在序列化数据中 例如 name age 但是 当我使用尝试使用 Angular 发布它时 h
  • Express 3.4.8 照片上传问题-不使用bodyParser()如何解决?

    我在 Gist 的代码 https gist github com yhagio 10654836 https gist github com yhagio 10654836 我是 Express 新手 尝试从 Node js in Act
  • WAMPServer 在 Windows 10 上无法正常工作,“无法执行服务操作”

    最近我从Windows 7 64升级到Windows 10 64 在此之前 我已经让 WAMPServer 运行得很好 但现在它不起作用了 每当我启动它时 我都会使服务器离线 单击 上线 只会弹出 无法执行服务操作 错误 我已经尝试过重新安
  • mapboxgl.js 与 leaflet.js

    我即将启动一个 Web 应用程序 其主要目的是显示 Mapbox 地图 切换图层并根据与地图的交互显示数据 我想知道我应该使用 mapboxgl js 和 leaflet js mapboxgl js 或 leaflet js 每个人都一直
  • 异步下载多个文件并等待所有文件完成,然后再执行其余代码

    我正在尝试从互联网下载多个文件并等待所有文件完成 这是我正在运行的 C 控制台应用程序 因此不需要进度条事件处理程序 然而 即使所有文件尚未下载 它目前也只是继续执行代码 1 下载所有文件 2 完成下载文件A 3 所有文件下载完毕 4 文件