gpt4 book ai didi

c# - WebClient DownloadFileAsync() 阻塞线程

转载 作者:行者123 更新时间:2023-11-30 14:12:39 25 4
gpt4 key购买 nike

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

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

这是我的代码:

    #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 应用程序,因此没有 asyncawait。整个应用程序无响应,根本没有窗口大小调整、按钮单击或文本框交互。

当我进入调试器时,我一直卡在 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#

它不会卡在那里,当进一步前进时,它会毫不拖延。

最佳答案

听起来您收到了关于下载字节数的很多反馈,并且属性更改事件处理程序的效率相对较低。也许您应该只限制更新 BytesReceived 的频率 - 按时间(例如每秒更新五次)或增量(当它的变化超过 K 时更新)或一些混合版本。

不过,您可能还想查看属性中发生的情况 - 看看那里是否有任何您可以优化的低效之处。

(第一步可能是计算 webClient_DownloadProgressChanged 被调用的次数。)

关于c# - WebClient DownloadFileAsync() 阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16866059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com