使用 C# 并行下载多个文件

2024-02-15

我想使用 C# 并行下载文件。为此,我编写了这段代码,该代码运行良好,但问题是 UI 冻结了。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace FileDownloader
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private static int count = 1;
        private static string f= "lecture";
        private string URL = "www.someexample.com";

        public MainWindow()
        {
            InitializeComponent();
        }

        public static string GetDirectoryListingRegexForUrl(string url)
        {
            if (url.Equals(URL))
            {
                return "<a href=\".*\">(?<name>.*)</a>";
            }
            throw new NotSupportedException();
        }

        public  void DownloadP(string[] urls)
        {
            Parallel.ForEach(urls.ToList(), new ParallelOptions { MaxDegreeOfParallelism = 10 }, DownloadFile);
        }

        private void DownloadFile(string url)
        {
           using(WebClient client=new WebClient())
           {
               if (url.EndsWith(".pdf"))
               {
                   int nextIndex = Interlocked.Increment(ref count);

                   client.DownloadFile(url, f + nextIndex + ".pdf");
                   this.Dispatcher.Invoke(() => {
                       listbox.Items.Add(url);
                   });
               }
           }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            DownloadP(listofFiles);
        }
    }
}

您可以使用async/await与新的结合WebClient method DownloadFileTaskAsync.

private async Task DownloadFile(string url)
{
    if (!url.EndsWith(".pdf"))
    {
        return;
    }

    using (var client = new WebClient())
    {
        int nextIndex = Interlocked.Increment(ref count);

        await client.DownloadFileTaskAsync(url, "lecture" + nextIndex + ".pdf");
        listBox.Items.Add(url);

    }
}

private async void Button_OnClick(object sender, RoutedEventArgs e)
{
    button.IsEnabled = false;
    await DownloadFiles(urlList);
    button.IsEnabled = true;
}

private async Task DownloadFiles(IEnumerable<string> urlList)
{
    foreach (var url in urlList)
    {
        await DownloadFile(url);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C# 并行下载多个文件 的相关文章

  • 使用MVVM Light的Messenger在视图模型之间传递值

    有人可以帮我解释一下 MVVM Light 的 Messenger 吗 我正在阅读 StackOverflow 上的一篇文章 MVVM 在视图模型之间传递值 https stackoverflow com questions 6392854
  • VS 2012 中缺少实体数据模型

    添加新项目时 我在 数据 选项卡下找不到实体数据模型 我查看了几个问题和答案以及有关此问题的信息 但没有一个解决方案有效 我已修复 卸载并重新安装 手动安装 EF Tools 包并尝试卸载所有 VS 相关程序 我还尝试在不同的 NET 框架
  • 多次客户端打印后,Arduino (Uno) 以太网客户端连接失败

    我正在使用带有以太网扩展板的 Arduino Uno 发送多次 HTTP 请求后 客户端 println 客户端连接时开始失败 故障时间似乎是随机的 并且循环中的序列读数可能在 1000 和 7000 之间变化 该错误与以太网发送缓冲区溢出
  • 如何在 OpenCV 中将 Float Mat 写入文件

    我有一个矩阵 Mat B 480 640 CV 32FC1 包含浮点值 我想将此矩阵写入一个可以打开的文件Notepad https en wikipedia org wiki Windows Notepad or 微软Word https
  • 使用 Protobuf-net 序列化 object[]

    我想序列化和反序列化存储在对象数组中的一些值 public class Sample public object Data 我知道在运行时数组中期望什么类型 实际上 我想将 Sample 内部的数据视为消息流 就个人而言 我知道我可以使用S
  • 无法使用Boost.process

    我下载并打包了 1 54 0 版本的 Boost 库 我做了类似回答这个问题的一切 如何在 Visual Studio 2010 中使用 Boost https stackoverflow com questions 2629421 how
  • if constexpr 与 sfinae

    随着引入if constexpr in c 17 通过使用编译时 SFINAE 解决了一些问题c 14 c 11现在可以使用解决if constexpr 具有更简单的语法 例如 考虑以下编译时递归的基本示例 以生成打印可变数量参数的子例程
  • 给定 X 在三次贝塞尔曲线上求 Y?

    我需要一种方法 允许我在给定 x 坐标的情况下找到三次贝塞尔曲线上的 Y 坐标 我遇到过很多地方告诉我将其视为三次函数 然后尝试找到根 我理解这一点 然而 三次贝塞尔曲线的方程是 对于 x 坐标 X t 1 t 3 X0 3 1 t 2 t
  • 构造函数定义和声明不匹配

    我有以下 C 代码 其中声明中构造函数的参数与构造函数的定义具有不同的常量性 testClass hpp class testClass public testClass const int x testClass cpp testClas
  • 在 C# 中使用正则表达式重复模式

    我有一串话 词黑暗王辉光我们结束你好再见低翼 我需要找到第一个单词的最后一个字母与以下单词的第一个字母匹配的单词 例如 worD Dark 我写了一个正则表达式 b w w W 1 w b 目前它成功找到连续 2 个单词 Regex Mat
  • 如何使用 Dapper 从 .NET 7 执行 Postgresql 函数,而不列出所有参数的数据类型

    我正在尝试将我的 NET 5 Web API 代码传输到 NET 7 我有一个名为的单例服务DataManager它实现了接口IDataManager 其中一项功能是Execute还有其他 C 函数 称为 Get GerMany 以及 In
  • 状态代码:404,原因短语:“未找到”,版本:1.1,

    我使用 Web api 自托管 public class TestController ApiController HttpPost public void Testp FromBody string title Console Write
  • 关于捕获异常的良好实践

    我正在用 C 11 编写一个小程序 并且第一次真正使用异常 我有一个关于如何有效捕获异常的问题 经过一番谷歌搜索后我仍然没有答案 这是问题 通过 const 左值引用捕获异常还是通过 const 右值引用捕获异常 哪个更有效 或推荐 在代码
  • 在第 i 个位置切换一点[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中设置 清除和切换单个位 https stackoverflow com questions 47981 how do you set clear and toggle a single
  • 使用 Elmah 进行异常处理

    我用 Elmah 记录异常 想知道我使用的技术是否是好的设计 现在 我捕获并重新抛出各种类和方法中发生的异常 并将它们记录到程序的主 try catch 块中的 Elmah 主程序 try Some code that fires off
  • 将 TableCell 文本转换为超链接

    我正在将 sql 查询中的数据提取到页面后面的 cs 代码中的 asp 表中 TableCell tCell1 new TableCell tCell1 Text myDataRow tid ToString 我想将其转换为超链接 我怎样才
  • 如何使用 C# 和 IBM Watson SDK 将实时音频流立即发送到 IBM Watson Speech-To-Text,而不在本地保存音频文件?

    我需要使用 IBM Watson SDK 使用麦克风录制音频 并使用 C 将其发送到 IBM Watson 语音转文本 我可以通过在本地保存音频文件然后使用发送它来实现此功能NAudio图书馆 但我的要求是使用流模式将实时音频发送到 IBM
  • 为什么我们从 MultiByte 转换为 WideChar?

    我习惯于处理 ASCII 字符串 但现在使用 UNICODE 我对一些术语感到非常困惑 什么是多字节字符以及什么是widechar有什么不同 多字节是指在内存中包含多个字节的字符吗 widechar只是一个数据类型来表示吗 为什么我们要从M
  • 当我想要发布项目时:“指定的路径、文件名或两者都太长”

    当我想运行或发布网络项目时 我收到此错误 严重性代码 说明 项目文件行抑制状态 错误 无法评估项目元数据 FullPath 项目元数据 FullPath 无法应用于路径 jquery ui 1 10 3 custom development
  • Nunit 测试给出结果 OneTimeSetUp: 未找到合适的构造函数

    我有一个问题 NUnit 告诉我 没有找到合适的构造函数 这是什么原因造成的 我还收到另一条消息 异常没有堆栈跟踪 这两条消息只是一遍又一遍地重复 这是我的代码 TestFixture public class SecurityServic

随机推荐

  • 为什么 Haskell 不能正确排序这些 IO 操作?

    我的一个朋友问我为什么要学习 Haskell 为了展示 Haskell 的强大功能 我编写了一个小程序来显示素数列表 main do putStr Enter the number of prime numbers to display n
  • 在 VB.NET 表单之间传递数据

    我有一个带有按钮的表单 单击时会弹出一个对话框表单 在此对话框中 用户需要选择一些数据 完成后单击 确定 按钮 一旦他们单击 确定 按钮 它需要将一个整数返回到之前的形式 我创建了一个对话框表单并尝试通过以下代码调用它 Dim intRes
  • JsTree 与 jquery.validate 冲突

    我有一个 Jstree 填充项目列表 当我单击一个节点时 会使用 ajax 加载部分节点 一切正常 直到我包含 jquery validate 脚本来验证我的表单
  • 无法在 Flutter 中使用 Firebase Auth 进行注册

    我正在为我的应用程序使用 Firebase 我已正确设置所有内容 并且 Firebase Firestore 工作正常 没有任何问题 我能够在那里读取和写入数据 但是当我尝试在 Firebase 中创建用户时 我在调试控制台中收到此消息 I
  • 如何在 nightwatch.js 中使用链接文本单击链接

    假设我的网页上有这些元素 a href dynamic1 One a a href dynamic2 Two a a href dynamic3 Three a 我想点击带有文字的链接Two 如何使用链接文字没有任何独特的属性 如 id 或
  • typescript Symbol.iterator

    我正在尝试创建一个自定义的可迭代对象 这是我的代码的简化示例 class SortedArray Symbol iterator yield 1 yield 2 yield 3 return 4 const testingIterables
  • 在 std::map 中搜索特定值[重复]

    这个问题在这里已经有答案了 可能的重复 检查 std map 中是否存在值 C https stackoverflow com questions 535317 checking value exist in a stdmap c 如何遍历
  • Unity中的LoadScene()函数什么时候改变场景?

    当您调用函数 LoadScene 时 它是立即切换场景 还是只是表示场景需要更改 LoadScene 的文档没有说 我正在使用的具体示例如下所示 LoadScene levelName ItemBox newBox ItemBox Inst
  • 在 Spring 中将 SOAP 1.2 与 WebServiceGatewaySupport 结合使用

    我对 Spring 框架非常陌生 在使用 Spring 创建一个简单的 SOAP 客户端时遇到了一些问题 像一个好的新手一样 我使用 Spring 教程来制作我的 SOAP 客户端 你可以在这里找到它 gt https spring io
  • Unity游戏画面模糊

    我的 Unity 游戏屏幕有问题 当我切换到游戏屏幕时 所有精灵都模糊了 场景视图非常好 但游戏场景很模糊 在 Sprite 的 Unity Inspector 中 您可以将 Generate Mip Map 设置为 false 或者您可以
  • 类叶组件中的 connect() 是 React+Redux 中反模式的标志吗?

    目前正在从事 React Redux 项目 我也在用归一化 https github com gaearon normalizr处理数据结构和reselect https github com reactjs reselect为应用程序组件
  • 如何使用 pip 从 git 子目录进行安装?

    我有一个包含许多文件夹的 git 存储库 其中一个是可使用 pip 安装的 python 模块 如下所示 repo git repo git folder1 repo git folder2 repo git mymodule repo g
  • 如何在 AWK 3.1.3 中按定义的顺序打印数组

    我用 google 搜索了一下 发现在 AWK 4 0 之后 我们可以通过在 for 循环之前放置 PROCINFO sorted in 命令来按定义的顺序打印数组 例如 PROCINFO sorted in ind num asc for
  • 关联类的正确使用

    我是 UML 的新手 我不确定我的图表是否正确 我希望得到比我更有经验的人的建议 我的问题的陈述说 学生学习课程 每个学生可以选修几门课程 每门课程 学习 任何课程都可以有多个学生学习 学生由数字代码识别 有姓名 出生日期和一个或多个国籍
  • 使用 javascript 将数据从一个域发送到另一个域(我可以访问两个网页的 )

    我可以访问两个页面上都有标签 我需要将数据从一个页面发送到另一页面 两个页面都位于不同的域中 页面 A 域 www foo com http www foo com 页面 B 域 www bar com http www bar com 如
  • C++ stringstream >> int 返回零

    我正在编写一个函数来返回数字的反转 即它转换int 1234 to int 4321 这就是我目前所拥有的 include
  • eclipse的jade模板语法支持吗?

    我刚刚开始使用nodejs 模板引擎jade 不幸的是 我的 IDE eclipse 似乎不支持此语法 并且无法正确突出显示 是否可以向 eclipse 添加对 jade 文件的支持 作为 Nodeclipse 工作 www nodecli
  • Google应用程序脚本网络应用程序,如何创建登录按钮?

    我在 Google Drive 中创建了由 Google 电子表格支持的脚本 并将其发布为网络应用程序 设置 执行应用程序为 我 和 谁有权访问该应用程序 任何人 甚至匿名 主页提供电子表格中的 html 内容 基本功能是 随机互联网用户
  • 为什么rotateY(翻转)css3动画在Chrome中闪烁?

    我做了一个jsFiddle http jsfiddle net Grezzo JR2Lu http jsfiddle net Grezzo JR2Lu 当您按下键盘上的 i 键时 图片会翻转以显示一些文本 但在翻转动画期间 在 Chrome
  • 使用 C# 并行下载多个文件

    我想使用 C 并行下载文件 为此 我编写了这段代码 该代码运行良好 但问题是 UI 冻结了 using System using System Collections Generic using System IO using System