c# - 在不阻塞 UI 的情况下在 ViewModel 中加载大量数据

标签 c# mvvm windows-store-apps windows-phone-8.1 mvvm-light

我想在页面加载后加载我的 View 模型,但我似乎不知道该怎么做。

这是 viewModel 方法,其中 LoadViewModel 中的两个方法都是长时间运行的异步方法:

public async Task LoadViewModel()        
{
    await GetAllTiles();
    await UpdateAllScenarioCardsAsync(); 
}

在 View 中我正在尝试这样的事情:

private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
    var viewModel = DataContext as StatsViewModel;
    if (viewModel != null)
    {
        var statsViewModel = viewModel;
        await statsViewModel.LoadViewModel();
    }
}

出于某种原因,LoadViewModel() 方法会阻止整个 UI,即使我删除了 GetAllTiles() 和 UpdateAllScenarioCardsAsync() 的等待... NavigationHelper_LoadState 方法在页面加载之前运行,所以我尝试注册 LoadViewModel( ) 到页面的 Loaded 事件,但我似乎无法让它工作。

编辑 这是我的 UpdateAllScenarioCardsAsync() 类。 UpdateTotalTilesAsync() 和 UpdataTodayTilesAsync() 在代码中也有 await 语句,但它仍然会阻塞 UI。我使用 closedScenario 是因为我认为问题可能是在错误范围内关闭变量,如本 question 中所回答的那样,但现在还是运气。我很想认为它与 foreach 循环有关,因为我已经在我的解决方案的其他地方成功地做到了这一点并且它不会阻塞 UI 线程,但该代码没有 foreach 循环。

private async Task UpdateAllScenarioCardsAsync()
{
    IsPending = true;

    try
    {
        // Load all of the scenario cards
        foreach (var scenario in _scenariosList)
        {
            var closedScenario = scenario;
            var data = new ScenarioDataCard(closedScenario);
            await UpdateTotalTiles(data);
            await UpdateTodayTestedTiles(data);
            ScenarioDataCards.Add(data);
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
    finally
    {
        IsPending = false;
    }
}

最佳答案

您需要在 LoadState 事件处理程序中添加一个等待。否则,它将在等待 LoadViewModel() 返回时简单地阻塞。像这样...

private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
    var viewModel = DataContext as StatsViewModel;
    if (viewModel != null)
    {
        await viewModel.LoadViewModel();
    }
} 

我还假设 GetAllTilesUpdateAllScenarioCardsAsync 方法已实现,因此它们确实在另一个线程上执行工作,因此它们不会阻塞主用户界面线程。

关于c# - 在不阻塞 UI 的情况下在 ViewModel 中加载大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28799824/

相关文章:

c# - wpf-单击按钮时动态创建新文本框和文本 block 并将其添加到网格行

c# - MVVM 在 VievModel 中使用 ShowViewModel 进行交叉导航

c++ - c++/cx 中的 storagefile::ReadAsync 异常?

c# - 分配有值绑定(bind)的依赖属性不起作用

c# - Lucene .NET 搜索结果

c# - 如何补救 "The breakpoint will not currently be hit. No symbols have been loaded for this document."警告?

c# - 缩放图像以适合 A4 页面 - Migradoc

C# MySQL 系统不工作

c# - MVVM 组合框绑定(bind) : Set and Get data from/to more sources

c++ - 在启动时暂停 Windows 10 应用商店应用程序