【发布时间】:2011-04-25 20:17:17
【问题描述】:
我正在获取项目列表并将它们放入 ListView。这个列表可能很长,所以我使用 Parallel.ForEach() 来处理 ListObjects 的构造。
实例化每个项目后,我在 UI 线程上触发一个事件以将项目添加到 ListView。我的日志记录向我表明,事件正在等待并行任务完成,然后再继续 AddItem 事件。这对我没有帮助。我需要显示器尽快更新,但如果它一直在等待事件,为什么要并行运行?
我不应该为此使用事件吗?通过创建一个委托来保存 UI 回调方法并改为使用它会更好吗?
【问题讨论】:
-
我已经有一段时间没有写了,但我记得一种创建列表控件的方法,该控件具有项目计数但实际上不包含任何内容。它不是将所有内容都保存在控件中,而是要求其控制器按需填写可见项目的数据。真的很有效。
-
好的,问题是 Parallel.ForEach 没有在单独的线程上执行,而不是在它启动的线程上执行。所以它正在使用 UI 线程(以及其他两个线程),并且在 Parallel.ForEach 循环完成后完成了任何调度。一旦我将 Parallel.ForEach 放在 Task.Factory.StartNew 中,它就会将 ForEach 放在不同的线程上,并且工作完全按照我认为应该的方式完成。
-
上面请求的代码:`Task.Factory.StartNew(() => { Parallel.ForEach(FileSystemInfoList, ListItemOptions, (WorkItem) => { //Task Body ItemCreator_DoWork_2(WorkItem); }); }); `(好的,你是怎么做代码标记的?)
-
public void ItemCreator_DoWork_2(ListViewItem) { ...创建专门的 ListViewItem... Task.Factory.StartNew(() => { OnAddItemProgress(new AddItemProgressEventArgs(CurrentPercentage, NewList)); }, CancellationToken。无,TaskCreationOptions.None,uiScheduler); }
标签: c# .net multithreading events parallel-processing