1

Mvvm パターンを使用してプログレス インジケーターを使用して DocumentViewer にいくつかのコンテンツを渡したいのですが、この世代では db から非同期的にデータを取得した後に UiElements を使用します。

    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;


    }
4

1 に答える 1

1

async/の優れた点の 1 つ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/ awaitintroMSDN の記事asyncを読むことをお勧めします。

于 2013-05-17T03:37:15.603 に答える