gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:44:29 29 4
gpt4 key购买 nike

我想在页面加载后加载我的 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com