.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
相关产品推荐
相关产品推荐

