主线程上的任务更新属性

时间:2014-03-03 12:50:50

标签: c# multithreading task-parallel-library task

我正在尝试更新主线程上的属性,它绑定到ProgressBar。在viewmodel中,我有波纹管代码,但无效。

TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();

Task task = Task.Factory.StartNew(() =>
{
    DoLongRunningWork();

}).ContinueWith(_=>
{   

    ApplicationStatus = "Task finished!";

}, TaskScheduler.FromCurrentSynchronizationContext());


DoLongRunningWork()
{
    // Alot of stuff

    Task.Factory.StartNew(() =>
    {
        ProgressBarValue += progressTick;
    }).Start(uiScheduler);
}

1 个答案:

答案 0 :(得分:4)

如果属性ProgressBarValue绑定到WPF元素,那么唯一可以更新ProgressBar的线程就是创建它的线程。

所以,我的假设是包含ProgressBarValue的类也实现了INotifyPropertyChanged。这意味着您有一些提升事件PropertyChanged的逻辑。

我会创建一个引发事件的方法,并始终使用Dispatcher。 (Dispatcher允许您在创建WPF控件的线程上调用函数。)

private void raisePropertyChanged(string name)
{
  Dispatcher.InvokeAsync(()=>
  {
    if(PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(name));
  });
}

这将始终更新正确线程上的ProgressBar