将UI Listview添加到我的并行进程会大大减慢速度

时间:2013-03-30 16:47:10

标签: winforms listview task-parallel-library

我在后台保存了超过100000个文件,一切都很快等等......我正在使用tpl库,真正使线程更容易。

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

  1. “lvwInProcess”列出正在处理的所有文件
  2. “lvwSaved”列出已保存的所有文件
  3. 我无法使用“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 我应该使用不同的控件吗?

    可以改善上述内容吗? 你会怎么做?

1 个答案:

答案 0 :(得分:0)

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