You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI:同步OnNavigatedTo调用异步ViewModel方法的问题解决

解决异步导航后执行ViewModel异步方法的死锁问题

问题原因

你用_viewModel.OnNavigatedTo().Wait()导致死锁的核心原因是:UI线程调用Wait()会阻塞自身,而ViewModel的异步方法在await后需要回到UI同步上下文继续执行,但此时UI线程已经被卡死,形成循环等待,最终导致应用无响应。

正确实现方式

直接将Page的OnNavigatedTo重写为async void(虽然通常不推荐async void,但UI生命周期方法是例外场景),然后awaitViewModel的异步方法即可,避免阻塞UI线程:

1. OtherPage.xaml.cs 代码

private readonly OtherPageViewModel _viewModel;

public OtherPage(OtherPageViewModel viewModel)
{
    InitializeComponent();
    _viewModel = viewModel;
    BindingContext = _viewModel;
}

protected override async void OnNavigatedTo(NavigatedToEventArgs args)
{
    base.OnNavigatedTo(args);
    // 直接await异步方法,不要用Wait()
    await _viewModel.OnNavigatedTo();
}

2. OtherPageViewModel 代码

public async Task OnNavigatedTo()
{
    // 这里写你的异步业务逻辑,比如加载远程数据、初始化资源
    await LoadPageDataAsync();
}

private async Task LoadPageDataAsync()
{
    // 示例:模拟异步操作
    await Task.Delay(1000);
    // 后续UI相关操作会自动回到UI线程
}

额外注意事项

  • 如果ViewModel的异步方法可能抛出异常,建议在OnNavigatedTo里添加异常捕获,避免崩溃:
    protected override async void OnNavigatedTo(NavigatedToEventArgs args)
    {
        base.OnNavigatedTo(args);
        try
        {
            await _viewModel.OnNavigatedTo();
        }
        catch (Exception ex)
        {
            // 处理异常,比如提示用户
            await DisplayAlert("错误", ex.Message, "确定");
        }
    }
    
  • 确保ViewModel已经通过依赖注入或者构造函数正确赋值,避免_viewModel为null。

内容的提问来源于stack exchange,提问作者Francesco Girelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:12:19