首页 > 解决方案 > 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());
    }
}

在此处输入图像描述

标签: c#listviewevents

解决方案


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...
        }));
    }
}

免责声明:正是这种修复方式仅适用于单个活动下载过程。但是并发下载的想法是相同的。


推荐阅读