2013-05-17 3 views
1

Я хочу передать некоторое содержимое на DocumentViewer с индикатором прогресса с использованием шаблона Mvvm, это поколение будет использовать UiElements после получения данных из db asynchrounously.Доступ к пользовательскому интерфейсу с помощью async/wait с Mvvm

public async void ProcessReportAsync(){ 

     IsBusy = true; 

     _reportDal = new ReportDal(_sprocName,_sprocParams); 
     ReportContainers = new ObservableCollection<ReportContainerViewModel>(); 

     await Task.Run(() => _reportDal.InitReportDal()); 
     ReportDataTable = _reportDal.DataTableReport; 

     await Task.Run(() => ProcessedElements()); 

     var t3 = Task.Run(() => ProcessPage(_reportPage)); 
     var t4 = Task.Run(() => ProcessContainerData()); 
     await Task.WhenAll(t3, t4); 
     var p = new PrinterViewModel(this); 

     // This statement does'nt complete its execuation, which is adding more UIElements 
     if(DispatcherHelper.UIDispatcher.CheckAccess()) { 

      DispatcherHelper.UIDispatcher.Invoke(
       ()=>_document = p.CreateDocument(new Size(p.PrintDialog.PrintableAreaWidth,p.PrintDialog.PrintableAreaHeight)) 
       ,DispatcherPriority.Background); 

     } 
    // Can't reach this code 
     IsBusy = false; 


    } 

ответ

1

Один хороший аспект async/await является то, что она занимается отправкой обратно в правильный контекст для вас.

public async Task ProcessReportAsync() 
{ 
    IsBusy = true; 

    _reportDal = new ReportDal(_sprocName,_sprocParams); 
    ReportContainers = new ObservableCollection<ReportContainerViewModel>(); 

    await Task.Run(() => _reportDal.InitReportDal()); 
    ReportDataTable = _reportDal.DataTableReport; 

    await Task.Run(() => ProcessedElements()); 

    var t3 = Task.Run(() => ProcessPage(_reportPage)); 
    var t4 = Task.Run(() => ProcessContainerData()); 
    await Task.WhenAll(t3, t4); 
    var p = new PrinterViewModel(this); 

    _document = p.CreateDocument(new Size(p.PrintDialog.PrintableAreaWidth,p.PrintDialog.PrintableAreaHeight)); 

    IsBusy = false; 
} 

Я предлагаю вам прочитать мой async/await intro и мой MSDN article on async.

+0

Большое спасибо Стивен, теперь отображается содержимое для DocumentViewer. Но поддержка IsBusy не работает хорошо, и кажется, что Ui не реагирует и работает синхронно. Я прочитаю вашу статью. –

Смежные вопросы