【发布时间】:2013-03-30 16:47:09
【问题描述】:
我在后台保存了超过 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 我应该使用其他控件吗?
以上可以改进吗? 你会怎么做?
【问题讨论】:
-
你真的向用户展示了 100 000 个项目吗?这没有任何意义。没有用户会浏览这么大的列表。
-
@svick true。你是对的。他们想看到某种更新进度,一开始我有一个简单的进度条和几个标签,例如“保存了 3 的 3434 等...... “在我看来这很好,因为没有用户有兴趣查看 10000 但是当你的老板告诉你一些事情而你告诉相反的事情然后他们告诉“做”你会做什么?告诉他们 f..off 不,不幸的是我不能
-
你有没有问过你的老板“为什么?”?
-
你有 2 个列表视图还是 4 个列表视图?我在您的 SaveFile 方法中看到了 lvwInProcess、lvwSaved、lvwProcessing、lvwPrevalidate。有什么区别?
-
@Scott 这是一个错误。2 listviews 我正在尝试一些事情
标签: winforms listview task-parallel-library