【问题标题】:process listview in background using tasks使用任务在后台处理列表视图
【发布时间】:2012-06-21 12:02:52
【问题描述】:

我有以下代码:

    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。

我怎样才能使这个功能在列表视图项被验证后立即更新?

【问题讨论】:

  • 为什么需要第一个this.BeginInvoke(new MethodInvoker...for?

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


【解决方案1】:

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

this.BeginInvoke(new MethodInvoker(() =>

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

Parallel.ForEach 也在 UI 线程上运行,最终分叉成一些调用的工作线程

this.BeginInvoke((Action)(delegate()

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

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

【讨论】:

  • 简而言之,将this.BeginInvoke(new MethodInvoker(lambda))替换为Task.Factory.StartNew(lambda)
【解决方案2】:

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

以这种方式对每个任务的ContinueWith 执行UI 更新。

希望这会有所帮助。

【讨论】:

  • 它有帮助,但我是 c# 新手,我不知道如何添加它:P
  • @KendallHildebrandt:好吧,按照提供的 MS 文档链接和提供的示例,你会看到。
  • 如果她不使用.Net 4.0,他也无法使用Parallel.ForEach()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2016-06-11
相关资源
最近更新 更多