2012-09-26 51 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

相關問題