xamarin - 使用在异步方法中打开新页面的代码,我是否需要在主线程上运行它,如果需要,我该怎么做?
问题描述
我有这个代码:
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);
}
由于这是一种异步方法,我想就这段代码是否应该专门在主线程上运行提出一些建议,如果是,那么我该怎么做?
解决方案
要在 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));
});
推荐阅读
- github - 验证 GitHub 变基和合并的提交消息
- r - 如何仅使用部分数字变量在 geom_tile ggplot 中对图块进行排序
- php - 通过 PHP 从端点返回“null”
- node.js - 如何使用 graphql 和 mongoose 进行突变
- r - 如何将标签添加到多个 ggplot 图(A、B、C)
- elasticsearch - 如何在 kafka-connect 融合平台的 elasticsearch sink 连接器配置中使用 ca cert?
- apache-spark - 编写数据帧时从 Spark 到数据库的连接有多少?
- python - 用户输入问题
- visual-studio-code - 在VScode中,如何在launch.json中添加带有$的参数
- pyodbc - 如何使用 pyodbc 接口连接计算表