【问题标题】:Adding UI Listview to my parallel process slows things down considerably将 UI Listview 添加到我的并行进程会大大减慢速度
【发布时间】:2013-03-30 16:47:09
【问题描述】:

我在后台保存了超过 100000 个文件,一切都很好,速度很快等等……我正在使用 tpl 库,确实让线程更容易。

我的问题: 被要求为用户添加一些用户界面。 我现在有 2 个列表视图

  1. “lvwInProcess”列出所有正在处理的文件
  2. “lvwSaved”列出所有已保存的文件

我不能使用“AddRange”,因为我一次更新一个,但是添加和删除一个项目会使我减慢 1000 倍

下面是一些简化的测试代码,给大家一个思路

    private void button1_Click(object sender, EventArgs e)
    {
        int count = 0;
        var parOpts = new ParallelOptions();
        string[] files = GetFiles();
        parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount;
        Task t1 = Task.Factory.StartNew(() =>
                                            {
                                                Parallel.ForEach(files, parOpts, (file, loopState) =>
                                                {
                                                    count = Interlocked.Increment(ref count);
                                                    SaveFile(file, count);

                                                });
                                            });
    }

    private void SaveFile(string file, int count)
    {           
        // FileProcess.Save(file);

        //update listview but removing the file
        // from the processing listview and add to the Saved listview

        var item = new ListViewItem(Path.GetFileName(file));
        lvwInProcess.Invoke(new MethodInvoker(() => lvwInProcess.Items.Add(item)));
        lvwSaved.Invoke(new MethodInvoker(() => lvwSaved.Items.Remove(item)));
        lvwInProcess.Invoke(new MethodInvoker(() => lvwProcessing.Refresh()));
        lvwSaved.Invoke(new MethodInvoker(() => lvwSaved.Refresh()));
    }

在添加和删除时无法使用 VirtualListView 我应该使用其他控件吗?

以上可以改进吗? 你会怎么做?

【问题讨论】:

  • 你真的向用户展示了 100 000 个项目吗?这没有任何意义。没有用户会浏览这么大的列表。
  • @svick true。你是对的。他们想看到某种更新进度,一开始我有一个简单的进度条和几个标签,例如“保存了 3 的 3434 等...... “在我看来这很好,因为没有用户有兴趣查看 10000 但是当你的老板告诉你一些事情而你告诉相反的事情然后他们告诉“做”你会做什么?告诉他们 f..off 不,不幸的是我不能
  • 你有没有问过你的老板“为什么?”?
  • 你有 2 个列表视图还是 4 个列表视图?我在您的 SaveFile 方法中看到了 lvwInProcess、lvwSaved、lvwProcessing、lvwPrevalidate。有什么区别?
  • @Scott 这是一个错误。2 listviews 我正在尝试一些事情

标签: winforms listview task-parallel-library


【解决方案1】:

在您的 ListViews 中有这么多项目,我肯定会在 Add/Refresh 方法周围使用 BeginUpdate 和 EndUpdate。这将减少一些 UI 的渲染时间。也可以使用 BeginInvoke() 来异步更新 UI。

【讨论】:

  • 我考虑过开始和更新,但不认为一次 1 项会产生任何影响。在这种情况下如何使用 beginInvoken
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2010-11-17
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2012-08-27
相关资源
最近更新 更多