私はバックグラウンドで100000以上のファイルを保存していますが、すべてが高速です...私はtplライブラリを使用していて、スレッド化が本当に簡単になります。
私の問題: ユーザーの視点からいくつかの UI を追加するように求められました。私は今2つのリストビューを持っています
- 「lvwInProcess」は、処理中のすべてのファイルを一覧表示します
- 「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 を使用できません 別のコントロールを使用する必要がありますか?
上記は改善できますか?どのようにしますか?