异步操作和UI更新

本文关键字:更新 UI 异步操作 | 更新日期: 2023-09-27 17:49:22

在一个由caliburn micro和teleerik控件组成的wpf应用程序中,我有不同的屏幕,从远程服务加载数据,然后在gridview/填充组合框中显示数据。我使用同步/等待操作符来进行负载检索操作,但我几乎可以肯定它有一些瓶颈。做等待,我有主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属性,它通过约定绑定到一个busy指示器如何正确设置?由于

更新#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);
        }
    }

在调试时,我看到所有的方法都是在主线程上执行的…不是应该在工作线程上吗?

异步操作和UI更新

在这种情况下,我加载了第一个任务,然后第二个任务没有并行性…我如何优化它?

你想要并发,而不是并行。您可以使用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属性通过约定绑定到busy指示符,如何正确设置?

通常,通过约定绑定的项需要实现INotifyPropertyChanged,以便更新已更新值的xaml绑定