C# 异步方法是否可以重写基类中的方法';Xamarin表单中是否不异步?
我有一个基类:C# 异步方法是否可以重写基类中的方法';Xamarin表单中是否不异步?,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我有一个基类: public abstract class BaseContentPage : ContentPage { protected BaseContentPage(in IAnalyticsService analyticsService, in IMainThread mainThread, in bool shouldUseSafeArea =
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");
}
我的问题是,我认为这两个问题是一样的:
a) 在Xamarin表单中以这种方式使用异步方法覆盖非异步方法可以吗
b) 我知道Xamarin调用正常的OnAppearing,但它会以同样的方式调用异步OnAppearing吗?
async
是一个实现细节。如果您有一个返回Task
的基本方法,那么无论基本方法是否使用async
,您都可以用async Task
覆盖它
这是一种特殊情况,因为返回类型为void
。在大多数情况下async void
实际上应该只用于事件处理程序
在这种特定情况下(
OnAppearing
),该方法在逻辑上是一个事件处理程序。因此,在这种特定情况下,使用async void
进行重写可能没问题。请记住,UI将在每次wait
返回其消息循环,异步实际上不是方法签名的一部分,因此它不会影响重写基本方法的能力。“OnAppearing”和“async OnAppearing”都可以在这里检查答案
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);