1

我在后台保存了超过 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 我应该使用不同的控件吗?

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

4

1 回答 1

0

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

于 2013-03-30T17:34:25.627 回答