我在后台保存了超过 100000 个文件,而且一切都很好,等等……我正在使用 tpl 库,真的让线程更容易。
我的问题:被要求为用户添加一些用户界面。我现在有 2 个列表视图
- "lvwInProcess" 列出所有正在处理的文件
- "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 我应该使用不同的控件吗?
以上可以改进吗?你会怎么做?