异步方法能否覆盖 Xamarin Forms 中非异步的基类中的方法?

问题描述

这是我拥有的一个基类:

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 voidasync void 实际上应该只用于事件处理程序。

在这种特定情况下 (OnAppearing),该方法在逻辑上是一个事件处理程序。因此,在这种特定情况下,用 async void 覆盖可能没问题。请记住,UI 将在每个 await 处返回其消息循环。