簡體   English   中英

異步操作和UI更新

[英]Async operations and UI update

在由caliburn micro和telerik控件組成的wpf應用程序中,我有不同的屏幕,這些屏幕從遠程服務加載數據,然后在gridview / fills組合框中顯示數據。 我正在使用sync / await運算符進行負載檢索操作,但幾乎可以確定它存在一些瓶頸。 在做等待,我有主UI線程等待與工作線程同步...考慮這個示例

Public class MyViewModel:Screen
{
  [omiss]

Public bool IsBusy {get;set;}  
 Public list<Foo> DropDownItems1 {get;set;}
Public  list<Foo2> DropDownItems2 {get;set;}

  Public async Void Load()
  {
    IsBusy =true;
     DropDownItems1 = await repository.LoadStates();
     DropDownItems2 = await repository.LoadInstitutes();
     IsBusy = false;
  }

}

在這種情況下,我首先加載了任務,然后又沒有並行性加載了第二個任務...如何優化此任務? 關於通過約定綁定到忙碌指示器的IsBusy屬性,如何正確設置? 謝謝

更新#1:

我是我的真實代碼

public async Task InitCacheDataTables()
    {
        var taskPortolio = GetPortfolio();
        var taskInstitutes = GetInstitutes();
        var taskStatus = GetStatus();
        var taskCounterparts = GetCounterparts();
        var taskCrosses = GetCrosses();
        var taskCurrencies = GetCurrencies();
        var taskSigns = GetSigns();

        await TaskEx.WhenAll(new[] { taskPortolio, taskInstitutes, taskStatus, taskCounterparts, taskCrosses, taskCurrencies, taskSigns });
    }

任務就像

 private async Task GetPortfolio()
    {
        try
        {
            dynamicContainer.SetValue(UserContainerKeyHelper.Portfolios, await commonRepository.GetPortfoliosAsync());
        }
        catch (Exception ex)
        {
            errorHandler.HandleErrorAsync(ex);
        }
    }
    private async Task GetInstitutes()
    {
        try
        {
            dynamicContainer.SetValue(UserContainerKeyHelper.Institutes, await commonRepository.GetInstitutesAsync());
        }
        catch (Exception ex)
        {
            errorHandler.HandleErrorAsync(ex);
        }
    }

在調試時,我已經看到所有方法都是在MainThread上執行的……不應該在workerthread上執行嗎?

在這種情況下,我首先加載了任務,然后又沒有並行性加載了第二個任務...如何優化此任務?

您需要並發,而不是並行。 您可以使用Task.WhenAll來等待它們,而不是依次等待每個任務:

public async Task LoadAsync()
{
     IsBusy = true;

     var firstDropDownItemsTask = repository.LoadStates();
     var secondDropDownItemsTask = repository.LoadInstitutes();

     await Task.WhenAll(DropDownItems1Task, DropDownItems2Task);

     DropDownItems1 = firstDropDownItemsTask.Result;
     DropDownItems2 = secondDropDownItemsTask.Result;

     IsBusy = false;
}

通過約定綁定到忙碌指示器的IsBusy屬性如何正確設置?

通常,通過約定綁定的項目需要實現INotifyPropertyChanged才能更新已更新值的xaml綁定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM