WebClient DownloadFileAsync() 阻塞线程

2024-02-19

我正在尝试使用 WPF 和 MVVM 从我的网络服务器下载一个大文件(500 mb)。因此,以下属性都绑定到某种控件(进度条)。问题是,即使使用 DownloadFileAsync,应用程序仍然挂起。

文件is从我的日志中可以看出,正在下载(当然,文件还在增长)。

这是我的代码:

    #region Methods

    private void StartDownload(string url, string localPath)
    {
        Logger.Debug("Starting to initialize file download");

        if (!_webClient.IsBusy)
        {
            _webClient = new WebClient();
            _webClient.Proxy = null; // http://stackoverflow.com/questions/754333/why-is-this-webrequest-code-slow/935728#935728
            _webClient.DownloadFileCompleted += webClient_DownloadFileCompleted;
            _webClient.DownloadProgressChanged += webClient_DownloadProgressChanged;

            _webClient.DownloadFileAsync(new Uri(url), localPath);
        }

        Logger.Debug("Finished initializing file download");
    }

    private void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        Logger.Debug("Download finished! Cancelled: {0}, Errors: {1} ", e.Cancelled, e.Error);
    }

    private void webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Logger.Debug("Downloading... Progress: {0} ({1} bytes / {2} bytes)", e.ProgressPercentage, e.BytesReceived, e.TotalBytesToReceive);

        if (!IsDownloadPaused)
        {
            DownloadFileProgress = e.ProgressPercentage;
            BytesReceived = e.BytesReceived;
            TotalBytesToReceive = e.TotalBytesToReceive;
        }
        else
        {
            Logger.Debug("Download paused...");
        }
    }

    #endregion Methods

根据评论请求编辑: 这是一个 .NET 4 CP 应用程序,因此没有async or await。整个应用程序无响应,根本没有窗口大小调整、按钮单击或文本框交互。

当我闯入调试器时,我一直挂在 OnPropertyChanged()-Method 中(我想是因为这是大部分时间都经过的地方)并得到以下调用堆栈:

Launcher.exe!Company.Product.Tools.Launcher.ViewModels.ViewModelBase.OnPropertyChanged(string propertyName) Line 16 + 0x59 bytes    C#
Launcher.exe!Company.Product.Tools.Launcher.ViewModels.DownloadViewViewModel.BytesReceived.set(long value) Line 82 + 0x21 bytes C#
Launcher.exe!Company.Product.Tools.Launcher.ViewModels.DownloadViewViewModel.webClient_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e) Line 216 + 0x3f bytes  C#

它不挂there,当进一步前进时,它不会有任何延迟。


听起来你好像得到了lots有关下载字节数的反馈,并且属性更改事件处理程序效率相对较低。也许你应该只限制更新频率BytesReceived- 按时间(例如每秒更新五次)或按增量(当更改超过 K 时更新)或某种混合版本。

不过,您可能还想了解一下该物业中发生的情况 - 看看是否有任何效率低下的地方可以优化。

(第一步可能是记录有多少次webClient_DownloadProgressChanged叫做。)

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

WebClient DownloadFileAsync() 阻塞线程 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 使用远程 couchbase 和 AWS ec2 时超时

    出于开发目的 我想将本地计算机连接到安装在远程 ec2 上的 couchbase 我成功建立连接 但当我尝试访问数据时出现超时 我搜索了问题并发现here https stackoverflow com questions 12117746
  • Java 的 varargs 性能

    编码 我来检查 Java 的 vararg 性能 我编写以下测试代码 public class T public static void main String args int n 100000000 String s1 new Stri
  • PHP 全局常量是一种良好的现代开发实践吗?

    我正在开发一个具有相当大的 PHP 代码库的新项目 该应用程序使用了相当多的 PHP 常量 define FOO bar 特别是对于数据库连接参数之类的事情 这些常量都定义在一个配置文件中 该文件是require once 基本上应用程序中
  • 连接两个时间序列的最有效方法

    想象一下我有一张这样的表 CREATE TABLE time series snapshot date DATE sales INTEGER PRIMARY KEY snapshot date 具有这样的值 INSERT INTO time
  • 运行查询时“不支持使用USE语句在数据库之间切换”

    尝试使用以下命令选择数据库时出现以下错误php s标准mssql select db功能 USE statement is not supported to switch between databases Use a new connec
  • Linux内核设备驱动程序以DMA方式进入内核空间

    LDD3 p 453 演示dma map single使用作为参数传入的缓冲区 bus addr dma map single dev gt pci dev gt dev buffer count dev gt dma dir Q1 这个缓
  • 装箱/拆箱和可为空?

    我知道装箱和拆箱是关于强制转换 真实类型到对象 对象到真实类型 但我不明白 MSDN 对 Nullable 的说法 这是我不明白的文字 当可空类型被装箱时 公共语言运行时会自动装箱 Nullable 对象的基础值 而不是 Nullable
  • 无法读取未定义的属性“client_secret”

    我尝试按照 Node js 的说明创建一个示例程序https developers google com google apps activity v1 quickstart nodejs https developers google c
  • 无法将 Json 解析为 NSDictionary

    我有一个 Web 服务 它返回以下 Json String password 1234 user andreas 我调用网络服务并尝试解析返回的数据 例如 NSURLConnection sendAsynchronousRequest re
  • 找不到模块:无法解析“F:\React\react-complete-guide\src\Component”中的“../axios”

    我在我的中遇到这个编译错误React我尝试发送的项目GET要求 src Component Form js Module not found Can t resolve axios in F React react complete gui
  • 是一个PrintWriter和BufferedWriter

    基本上我想知道 PrintWriter 是否是缓冲写入器 我见过这样的代码PrintWriter pw new PrintWriter new BufferedWriter new FileWriter file 然而从这个javadoc
  • 如何用C语言制作ppm文件的黑白图片?

    嘿 我的代码需要一些帮助 我读取了 ppm 文件 将颜色更改为黑色和白色 并希望将其保存到新文件中 我可以读取文件的标题并将其写入新文件 但我在更改颜色方面遇到了困难 我知道我可以用以下公式得到灰度值 0 299 红色分量 0 587 绿色
  • 从不同文件夹压缩文件,保留目录结构

    我编写了一些非常有趣的代码来压缩多个文件和文件夹 该脚本将采用参数列表 文件和文件夹 并将它们压缩为以日期 时间作为名称的 zip 所以我需要一些在参数是文件时执行的代码 该代码应将文件的目录结构添加到 zip 文件中 THE SCRIPT
  • 如何使用 DBpedia 属性构建主题层次结构?

    我试图通过遵循下面提到的两个 DBpedia 属性来构建主题层次结构 skos 更广泛的财产 dcterms 主题属性 我的目的是给这个词确定它的主题 例如 给出这个词 支持向量机 我想从中识别主题 例如分类算法 机器学习等 然而 有时我对
  • 使用 Perl 单行从文本文件中提取列:类似于 Unix cut

    我使用的是 Windows 我想使用 Perl Python 批处理等单行代码从文本文件中提取某些列 在 Unix 上我可以这样做 cut d f 1 3
  • 如何轻松地在 Git 中的多个发布分支上应用错误修复?

    我已经使用 git 进行单人开发有一段时间了 但直到现在我还没有遇到任何棘手的分支问题 而且我似乎忘记了一些基本的东西 而我在阅读实用版本后无疑 知道 这些东西使用 Git 进行控制书籍 我经常比我的网站上实际发布的内容提前几个版本 因此当
  • Hololens TCP 套接字 - Hololens 服务器的 Python 客户端

    经过几周的挫折后 我终于能够将一个字符串从 Python 客户端发送到 Hololens 服务器 代码如下并且运行完美 但是 我想知道是否有使用套接字经验的人可以帮助我修改此代码以将 openCV 网络摄像头帧 基本上只是发送图像 从 Py
  • 警告:复制捆绑资源构建阶段包含此目标的 Info.plist 文件

    我将一个项目分成两个构建 并给每个构建一个plist文件 一切正常 但我不断收到此构建警告 警告 复制捆绑资源构建阶段包含此目标的 Info plist 文件 MyApp Info plist 当我尝试构建时我得到了这个MyApp 构建第二
  • 数据库架构更新

    我正在开发一个使用本地 SQLite 数据库的 AIR 应用程序 并且想知道在分发新版本的应用程序时如何管理数据库架构更新 还考虑跳过某些版本的更新 例如 不是从 1 0 到 1 1 而是从 1 0 到 1 5 您会推荐什么技术 对于 SQ
  • WebClient DownloadFileAsync() 阻塞线程

    我正在尝试使用 WPF 和 MVVM 从我的网络服务器下载一个大文件 500 mb 因此 以下属性都绑定到某种控件 进度条 问题是 即使使用 DownloadFileAsync 应用程序仍然挂起 文件is从我的日志中可以看出 正在下载 当然