WPF和EF与等待异步,冻结我的用户界面

时间:2019-02-14 18:09:34

标签: wpf async-await entity-framework-core

我认为我错误地使用了await异步模式,并且不确定如何解决它。我的代码基于一些多视角的教程。

基本上,我使用EF连接到数据库,并尝试通过将ObservableCollection绑定到视图来显示数据。

我首先从数据上下文中获取数据,如下所示:

public interface ICountryData
{
    Task<List<Country>> GetAllAsync();
}

public class SqlCountryData : ICountryData
{
    private NodeDBContext _context;

    public SqlCountryData(NodeDBContext context)
    {
        _context = context; 
    }

    public async Task<List<Country>> GetAllAsync()
    {
        return await _context.Countries.Include(i => i.AvailableDocuments).OrderBy(c => c.CountryName).ToListAsync();
    }
}

然后调用GetAllAsync方法:

public async Task LoadAsync()
    {
        List<Country> countries = await _countryData.GetAllAsync();

        Countries.Clear();
        foreach (Country s in countries)
        {
            Countries.Add(s);
        }


    }

我还通过foreach循环将所有项目粘贴到我的ObservebleCollection中。

public ObservableCollection<Country> Countries { get; set; }

依次绑定到我的Viewmodel中

<telerik:RadGridView x:Name="Countries"
                             GroupRenderMode="Flat"
                             RowIndicatorVisibility="Collapsed"
                             CanUserFreezeColumns="False"
                             ItemsSource="{Binding Countries}"
                             SelectedItem="{Binding SelectedCountries}"
                             ShowSearchPanel="True" />

所有这些都很好。但是它将冻结UI直到完成。

---编辑以添加一些代码,以显示如何调用LoadAsync ---

MainWindowViewModel _viewModel;

    public MainWindow(MainWindowViewModel viewModel)
    {
        InitializeComponent();
        _viewModel = viewModel;
        DataContext = _viewModel;
        Loaded += MainWindow_LoadedAsync;
    }

    private async void MainWindow_LoadedAsync(object sender, RoutedEventArgs e)
    {
        await _viewModel.LoadAsync();
    }

在MainWindow视图模型内部:

public async Task LoadAsync()
    {
        await LookupViewModel.LoadAsync();
    }

0 个答案:

没有答案