c# - ProgressChanged 事件中的 Listview 更新太慢了应用程序
问题描述
我有一个ProgressChanged
要下载的事件,在这个事件中我更新了一个Listview
写入异步线程的状态。但是这个操作会减慢程序的速度,甚至会导致Not Responding。我的代码和 ss 在下面。我该如何解决这个问题。
private void downloader_ProgressChanged(object sender, EventArguments.ProgressChangedEventArgs e)
{
this.Invoke(new Action(() =>
{
progressBar1.Value = (int)(downloader.Progress * 100);
if (downloader.Info.ContentSize > 0)
lblContentSize.Text = downloader.Info.ContentSize.ToHumanReadableSize();
lblSpeed.Text = downloader.Speed.ToHumanReadableSize() + "/s";
lblReceived.Text =
string.Format("{0} ({1})",
downloader.TotalBytesReceived.ToHumanReadableSize(),
string.Format("{0:0.00}%", downloader.Progress));
segmentedProgressBar1.ContentLength = downloader.Info.ContentSize;
segmentedProgressBar1.Bars = downloader.Ranges.ToList().Select(x => new Bar(x.TotalBytesReceived, x.Start, x.Status)).ToArray();
lblResumeability.Text = downloader.Info.AcceptRanges ? "Yes" : "No";
listView1.BeginUpdate();
writeThreads();
listView1.EndUpdate();
}));
}
private void writeThreads()
{
var ranges = downloader.Ranges.ToList();
ranges = ranges.Where(x => !x.IsIdle).ToList();
for (var i = 0; i < ranges.Count; i++)
{
listView1.Items[i].SubItems[1].Text = (ranges[i].TotalBytesReceived.ToHumanReadableSize());
listView1.Items[i].SubItems[2].Text = (ranges[i].Status.ToString());
}
}
解决方案
DownloadProgressChanged
在收到的每个块上触发,例如收到的每个 4kb。您可能不会为每次调用更新 UI,但仅在更改百分比时才更新。
private int storedPercentage = -1;
private void downloader_ProgressChanged(object sender, EventArguments.ProgressChangedEventArgs e)
{
if (e.ProgressPercentage != storedPercentage)
{
storedPercentage = e.ProgressPercentage;
this.Invoke((Action)(() =>
{
// existing code...
}));
}
}
免责声明:正是这种修复方式仅适用于单个活动下载过程。但是并发下载的想法是相同的。
推荐阅读
- r - R - 安装源包时出错:未知时区 GMT
- android - 尝试新 Apple ID 登录时的 invalid_grant
- javascript - 单击它时如何获取div的值?
- c# - 在 .Net Core 3.0 项目中正确设置 ASP.Net Core 授权和身份验证
- python - psql 复制命令在远程服务器中创建空文件
- python-requests - Python 请求模块 - 如何更改响应对象语言?
- c# - EditorConfig - 如何在自定义分析器中访问 editorconfig 规则设置
- ruby-on-rails - Omniauth Facebook:注册后重定向不起作用
- javascript - 如何在 Ionic 4 中的变量中获取 div 值
- python - 有没有办法我可以在 python 3.8 中访问这些 Rates 而不会出现 TypeError: 'dict_keys' object is not subscriptable?