任务在通知进度之前完成。为什么以及如何修复?

时间:2018-04-16 17:20:33

标签: c# wpf asynchronous task

所以我尝试使用IProgress<T>来使用任务进度通知。这是我的工作:

  1. 创建Progress<T>并将处理程序附加到其ProgressChanged事件。
  2. 在事件处理程序中,我更新特定于UI的属性以显示进度。
  3. 运行循环并创建Task个对象以执行工作单元。每个任务使用Progress对象来报告进度(进而调用ProgressChanged并更新UI)。
  4. 使用Task.WaitAll()阻止所有任务完成。最后显示完成消息。
  5. 代码看起来像这样:

    IProgress<Tuple<DataRow, MyVM>> BakeProgress;
    BakeProgress = new Progress<Tuple<DataRow, MyVM>>();
    
    ((Progress<Tuple<DataRow, MyVM>>)BakeProgress).ProgressChanged += (sender, args) =>
    {
      _BakeProgress += 100.0 / AllDataRows.Length;
      RaisePropertyChanged(NameOf(BakeProgress));
    };
    
    var BakeTasks = new List<Task>();
    foreach (var dr in AllDataRows) {
    
      BakeTasks.Add(Task.Run(() =>
      {
        var Baked = MyBakingFunc();
    
        BakeProgress.Report(new Tuple<DataRow, MyVM>(dr, Baked));
    
        return Baked;
      }));
    }
    
    Task.WaitAll(BakeTasks.ToArray());      //Shouldn't this wait
    
    MessageBox.Show("Baking Completed");
    

    令我惊讶的是,此代码在点击MessageBox事件处理程序之前点击ProgressChanged甚至一次。我做错了什么?

    N.B。它会为每个Task实例执行一次ProgressChanged事件处理程序,但只有命中完成的行后才会执行。

    N.B。啊,我确实读过this,但由于这是WPF,我们确实有一个同步上下文,其中创建了Progress对象。

0 个答案:

没有答案