1

私はバックグラウンドで100000以上のファイルを保存していますが、すべてが高速です...私はtplライブラリを使用していて、スレッド化が本当に簡単になります。

私の問題: ユーザーの視点からいくつかの UI を追加するように求められました。私は今2つのリストビューを持っています

  1. 「lvwInProcess」は、処理中のすべてのファイルを一覧表示します
  2. 「lvwSaved」は、保存されたすべてのファイルを一覧表示します

一度に1つずつ更新しているので「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 に答える