如何从 .NET MAUI 中的同步 UI 事件方法运行异步方法或命令

问题描述 投票:0回答:1

最近我一直在花时间尝试弄清楚如何从.NET MAUI中的同步 UI事件方法运行异步方法或命令,最后,我得出了一个结论,我将向某人解释谁像我一样在寻找它,却没有找到真正有用的东西。

问题示例是:

我有一个带有 ViewModelMainPage,当单击按钮时,它会在 ViewModel 中执行命令,通过 Shell 导航方法将用户导航到新的 ContentPage,并且当此 导航完成,我想从第二个 ContentPage 的 ViewModel 执行一个方法,我尝试通过重写第二个 ContentPageOnNavigedTo 方法来执行此操作,然后从那里调用其上的方法或命令ViewModel,但要调用的命令或方法是异步,而OnNavigedTo方法是同步,所以:

如何调用异步方法而不导致 UI 和应用程序异步流程出现问题?

让我们以 ContentPage 类为例,它将成为我们的 MainPage:

public partial class MainPage : ContentPage
{

    private readonly MainPageViewModel _viewModel;

    public MainPage(MainPageViewModel mainPageViewModel)
    {
        _viewModel = mainPageViewModel;
        BindingContext = _viewModel;
        InitializeComponent();
    } 
}

及其 ViewModel:

public partial class MainPageViewModel : BaseViewModel
{
    //Consider that this method is a Command and is binded to a button click
    public async Task GoToOtherPage() {
        await Shell.Current.GoToAsync(nameof(OtherPage));
    }
}

现在另一边有一个OtherPage

public partial class OtherPage : ContentPage
{

    private readonly OtherPageViewModel _viewModel;

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

及其 ViewModel:

public partial class OtherPageViewModel : BaseViewModel
{
    //This is the asynchronous method to be called when the user navigates to this page
    public async Task OnNavigatedTo() 
    {
        //Do something asynchronously
    }
}

现在我尝试通过重写 OtherPageOnNavigedTo 方法来调用它:

public partial class OtherPage : ContentPage
{

    private readonly OtherPageViewModel _viewModel;

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

    public override void OnNavigatedTo()
    {
        _viewModel.OnNavigatedTo().Wait();
    }
}

但应用程序运行时处于“中断状态”。 我能做什么?

c# .net asynchronous maui synchronous
1个回答
0
投票

要解决这个问题,你只需要使用

Dispatcher

调用异步操作即可。 示例:

protected override void OnNavigatedTo(NavigatedToEventArgs args) { base.OnNavigatedTo(args); Dispatcher.DispatchAsync(async () => { await _viewModel.OnNavigatedTo(); }); }

这将通过 UI 线程分派操作,并且不会阻塞应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.