代码之家  ›  专栏  ›  技术社区  ›  Álvaro García

如何在视图中使用异步方法和绑定更新全局集合?

  •  0
  • Álvaro García  · 技术社区  · 7 年前

    private async Task getDataASync()
    {
        Task<List<Typ01>> miTsk01 = VariablesGlobales.getData01Async();
        Task<List<Type02>> miTsk02 = VariablesGlobales.getData02Async();
        Task<List<Type03>> miTskT03 = VariablesGlobales.getData03Async();
        Task<List<Type04>> miTsk04 = VariablesGlobales.getData04Async();
    
    
    
        await Task.WhenAll(miTsk01,
        miTsk02,
        miTsk03,
        miTsk04).ConfigureAwait(false);
    
    
        GlobalVariables.vgData01.AddRange(miTsk01.Result);
        GlobalVariables.vgData02.AddRange(miTsk02.Result);
        GlobalVariables.vgData03.AddRange(miTsk03.Result);
        GlobalVariables.vgData04.AddRange(miTsk04.Result);
    }
    
    
    
    
    public MyViewModel()
    {
        getDataASync();
    }
    

    XAML公司

        <ComboBox
          SelectedItem="{Binding MySelectedItem01}"
          ItemsSource="{x:Static vg:VariablesGlobales.vgData01}">
        </ComboBox>
    
    <ComboBox
      SelectedItem="{Binding MySelectedItem02}"
      ItemsSource="{x:Static vg:VariablesGlobales.vgData02}">
    </ComboBox>
    
    <ComboBox
      SelectedItem="{Binding MySelectedItem03}"
      ItemsSource="{x:Static vg:VariablesGlobales.vgData03}">
    </ComboBox>
    
    <ComboBox
      SelectedItem="{Binding MySelectedItem04}"
      ItemsSource="{x:Static vg:VariablesGlobales.vgData04}">
    </ComboBox>
    

    问题是,我得到一个错误,说collectionView不能被另一个不同于Dispatcher的子进程修改。

    如何将全局集合更新为可以由视图绑定的集合?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Peregrine    7 年前

    有几种方法可以解决这个问题。

    await Task.WhenAll(miTsk01,
    miTsk02,
    miTsk03,
    miTsk04).ConfigureAwait(true);
    
    GlobalVariables.vgData01.AddRange( await miTsk01);
    GlobalVariables.vgData02.AddRange( await miTsk02);
    GlobalVariables.vgData03.AddRange( await miTsk03);
    GlobalVariables.vgData04.AddRange( await miTsk04);
    

    几张纸条

    • 您的集合可能应该是ObservableCollection而不是List,这将反映对绑定UI控件的列表所做的任何更改。它们不支持AddRange()作为标准,因此您需要单独添加这些项。

    另一种方法是使用 this one

        2
  •  1
  •   mm8    7 年前

    我真的不太了解这个问题,因为在从数据库获取数据的方法中,它会等到我获取所有数据,然后更新全局集合。我以为我在同一个线程比主应用程序,但似乎我错了。

    如果你打电话给 getDataASync() 在UI线程上,您唯一要做的就是通过删除对的调用来捕获上下文 ConfigureAwait(false) :

    await Task.WhenAll(miTsk01,
        miTsk02,
        miTsk03,
        miTsk04);
    

    ConfigureAwait(错误) getDataASync() Task.WhenAll getDataASync() 方法最初被调用。

    getDataASync() @Stephen Cleary's MSDN Magazine article