问题描述
这是我拥有的一个基类:
public abstract class BaseContentPage : ContentPage
{
protected BaseContentPage(in IAnalyticsService analyticsService,in IMainThread mainThread,in bool shouldUseSafeArea = false)
{
MainThread = mainThread;
AnalyticsService = analyticsService;
this.DynamicResource(BackgroundColorProperty,nameof(BaseTheme.PageBackgroundColor));
On<iOS>().SetUseSafeArea(shouldUseSafeArea);
On<iOS>().SetModalPresentationStyle(UIModalPresentationStyle.FormSheet);
}
protected IAnalyticsService AnalyticsService { get; }
protected IMainThread MainThread { get; }
protected override void OnAppearing()
{
base.OnAppearing();
AnalyticsService.Track($"{GetType().Name} Appeared");
}
后来这样使用:
public class SplashScreenPage : BaseContentPage
{
readonly Label _loadingLabel;
readonly Image _gitTrendsImage;
readonly FirstRunService _firstRunService;
readonly AppInitializationService _appInitializationService;
public SplashScreenPage(IMainThread mainThread,FirstRunService firstRunService,IAnalyticsService analyticsService,AppInitializationService appInitializationService)
: base(analyticsService,mainThread)
{
}
protected override async void OnAppearing()
{
base.OnAppearing();
await ChangeLabelText(_statusMessageEnumerator.Current);
我的问题是我对同一件事的看法:
a) 在 Xamarin Forms 中以这种方式使用时,可以用异步方法覆盖非异步方法吗?
b) 我知道 Xamarin 会调用普通的 OnAppearing,但它会以相同的方式调用异步 OnAppearing 吗?
解决方法
async
是一个实现细节。如果您有一个返回 Task
的基本方法,那么无论基本方法是否使用 async Task
,您都可以使用 async
覆盖它。
这是一种特殊情况,因为返回类型是 void
。在大多数情况下,you should avoid async void
。 async void
实际上应该只用于事件处理程序。
在这种特定情况下 (OnAppearing
),该方法在逻辑上是一个事件处理程序。因此,在这种特定情况下,用 async void
覆盖可能没问题。请记住,UI 将在每个 await
处返回其消息循环。