首页 > 解决方案 > 使用在异步方法中打开新页面的代码,我是否需要在主线程上运行它,如果需要,我该怎么做?

问题描述

我有这个代码:

  private async void GoalMgmt()
  {
     await PopupNavigation.Instance.PopAsync();
     await _navigationService.OpenPageAsync<GoalsPage>();
  }

  public async Task OpenPageAsync<T>() where T : Xamarin.Forms.Page
  {
     var page = Startup.ServiceProvider.GetRequiredService<T>();
     await Shell.Current.Navigation.PushModalAsync(page, false);
  }

由于这是一种异步方法,我想就这段代码是否应该专门在主线程上运行提出一些建议,如果是,那么我该怎么做?

标签: xamarinxamarin.forms

解决方案


要在 UI 线程(或主线程)上运行代码,您应该使用下面的代码强制代码在 MainThread 上运行。

请注意,任何异步方法都“可能”在 Xamarin 认为合适的任何其他线程中运行代码。

在使用异步方法时,程序有一些聪明的方法可以知道您的代码是否应该在 MainThread 上运行。

如果您想了解完整的来龙去脉,请查看我的经理发给我的这篇文章: https ://devblogs.microsoft.com/dotnet/configureawait-faq/

Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
            {
                App.NavigationService.SetAsRoot(nameof(Views.StartPage));
            });

调用异步等待方法:

 Xamarin.Forms.Device.BeginInvokeOnMainThread(async() =>
            {
                await App.NavigationService.NavigateTo(nameof(Views.StartPage));
            });

推荐阅读