在运行任务时更新UI

时间:2010-11-19 10:33:17

标签: c# wpf multithreading invoke

我有以下代码:

        progressBar1.Minimum = 0;
        progressBar1.Maximum = Results.Count;

        foreach (MyClass cls in Results)
        {                
              progressBar1.Value += 1;

              // Go to DB and get large quantity of data
              cls.GetHistoryData();

        }

我想要做的是将处理转移到另一个线程,以便progressBar1正确更新。我发现article意味着我应该可以在进度条上使用Invoke方法,但似乎没有。

5 个答案:

答案 0 :(得分:2)

你应该检查BackgroundWorker课程。它支持进度并正确处理线程之间的通信。

答案 1 :(得分:2)

如果将进度条绑定到数据属性,则无需手动切换线程上下文。 WPF绑定引擎将自动为您执行此操作。

<ProgressBar Value={Binding Progress} />

然后在你的主题中:

foreach (MyClass cls in Results)
{                
      // databinding will automatically marshal to UI thread
      this.Progress++;
      cls.GetHistoryData();
}

在大多数情况下,这比使用Dispatcher.InvokeBackgroundWorker

自行编组更清晰,更不容易出错

答案 2 :(得分:0)

你可以这样开始一个新线程:

Thread t1 = new Thread(methodnametocall);
   t1.start();

void methodnametocall()
{
   this.Invoke((MethodInvoker)delegate
   {

        control to update;
    }
});

答案 3 :(得分:0)

试试这个

progressBar1.Minimum = 0;
progressBar1.Maximum = Results.Count;

foreach (MyClass cls in Results)
{
    ThreadPool.QueueUserWorkItem((o) =>
             {
                 progressBar1.Dispatcher.BeginInvoke(
                     (Action) (() => progressBar1.Value += 1));
                 cls.GetHistoryData();
             });
}

答案 4 :(得分:0)

您链接的文章是一个winforms示例,但您正在制作WPF应用程序。在您的情况下,您应该考虑使用Dispatcher类,通过控件的Dispatcher属性。