【问题标题】:Progress Reporting from an Async method in a Windows 8 Store AppWindows 8 应用商店应用中异步方法的进度报告
【发布时间】:2012-09-26 21:24:23
【问题描述】:

在 Windows 8 风格的应用程序中,我有以下代码检索自定义 FileService 中的文件列表。这是在 ViewModel 的构造函数中触发的。

private async void Construct()
{
   Files = new ObservableCollection<FileViewModel>();
   IList _files = await _fileRepository.GetFiles();
   foreach (File file in _files)
   {
      Files.Add(new FileViewModel(file));
   }
}

它工作得很好,但我正在努力弄清楚我将如何对此执行进度报告以通知用户在加载文件时正在发生某些事情。

看着它,我想要一个 bool IsBusy 属性,我可以将它绑定到 View 上的 ProgressRing 之类的东西。我知道我可以在进程开始时将此设置为 true,但是如何从操作中获取 Completed 回调,然后我可以将此属性设置为 False?

非常感谢!

【问题讨论】:

    标签: c# windows-8 progress-bar winrt-xaml async-await


    【解决方案1】:

    首先,我认为您不应该使用async void 方法(当然,除非它们是事件处理程序)。 “异步构造函数”最好实现为静态 async 工厂方法或 asynchronous lazy initialization(在我的博客中解释)。这两种方法都比async void好。

    现在,开始进度报告。 Task-based Asynchronous Programming 文档描述了报告进度的推荐方式,我的 AsyncEx 库包含一个名为 PropertyProgressIProgress&lt;T&gt; 实现,专门用于将进度更新视为 ViewModel 可观察属性。

    但是,听起来您只需要一个“忙碌指示器”,而不是完整的“进度报告”。这个比较简单:

    private async Task Construct()
    {
      Files = new ObservableCollection<FileViewModel>();
      IsBusy = true;
      IList _files = await _fileRepository.GetFiles();
      IsBusy = false;
      foreach (File file in _files)
      {
        Files.Add(new FileViewModel(file));
      }
    }
    

    在此示例中,我假设 IsBusy 设置器将适当地提高 INotifyPropertyChanged.PropertyChanged

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 2014-01-18
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多