使用任务在后台处理listview

时间:2012-06-21 12:02:52

标签: c# winforms backgroundworker task-parallel-library multitasking

我有以下代码:

    private void _DoValidate(object sender, DoWorkEventArgs e)
    {
        this.BeginInvoke(new MethodInvoker(() =>
        {
            Parallel.ForEach
                (this.listView2.CheckedItems.OfType<ListViewItem>(),
                new ParallelOptions { MaxDegreeOfParallelism = 4 },
                (item) =>
                {
                    List<string> data = new List<string>();
                    for (int s = 1; s < 5; s++)
                    {
                        if (item.SubItems[s].Text != null)
                            data.Add(item.SubItems[s].Text);
                        else
                            data.Add("");
                    }
                    this.BeginInvoke((Action)(delegate()
                    {
                        bool verified = checkdata(data);
                        item.Checked = verified;
                    }));
                });
        }));
    }

正在运行但是在完成所有任务后它正在更新gui。 我添加了一个后台工作,以便在任务运行时能够使用gui。

如何在最终验证列表视图后立即更新listviewitems?

2 个答案:

答案 0 :(得分:1)

我认为你的问题是你只是在UI线程上排队。 我不知道这条线到底是什么

this.BeginInvoke(new MethodInvoker(() =>

但看起来它在UI线程上运行了一些东西。

Parallel.ForEach也在UI线程上运行,最终分支到一些调用

的工作线程
this.BeginInvoke((Action)(delegate()

再次 - 这只是UI线程上的排队工作,直到Parallel.ForEach方法返回(它等待所有工作线程首先完成)才会执行,但它也在UI线程上运行!

我建议通过使用BackgroundWorker或只调用Task.Factory.StartNew在工作线程上运行Prallel.ForEach。

答案 1 :(得分:0)

如果使用4.0,则可以使用Task.ContinueWith构造。

通过这种方式,每个任务的ContinueWith执行UI更新。

希望这有帮助。