2012-09-26 25 views
1

在Windows 8样式应用程序中,我有以下代码正在检索自定义FileService中的文件列表。这是在ViewModel的构造函数中触发的。Windows 8商店应用程序中的异步方法的进度报告

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

它完美,但我很努力弄清楚是我会怎样执行进展本报告通知而被加载文件某些事情正在发生的用户。

看着它,我想有,我可以绑定到像在查看一个ProgressRing一个bool IsBusy属性。我知道我可以在流程开始时将此设置为true,但是如何从操作中获得Completed回调,然后将该属性设置为False?

非常感谢!

回答

1

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

现在,继续进行报告。 Task-based Asynchronous Programming文档描述了推荐的报告进度方式,我的AsyncEx库包含一个专门用于将进度更新视为ViewModel可观察属性的IProgress<T>实现,其名称为PropertyProgress

但是,它听起来像你只需要一个“繁忙的指标”,而不是一个完整的“进度报告”。这是一个相当简单一点:

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

相关问题