【问题标题】:Can an async method override a method in a base class that's not async in Xamarin Forms?异步方法能否覆盖 Xamarin Forms 中非异步的基类中的方法?
【发布时间】:2021-04-03 15:17:35
【问题描述】:

这是我拥有的一个基类:

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 实际上并不是方法签名的一部分,因此它不会影响您覆盖基本方法的能力。 “OnAppearing”和“async OnAppearing”都可以工作

标签: c# xamarin xamarin.forms


【解决方案1】:

async 是一个实现细节。如果您有一个返回Task 的基方法,那么无论基方法是否使用async,您都可以用async Task 覆盖它。

这是一种特殊情况,因为返回类型是void。在大多数情况下,you should avoid async void。 async void 实际上应该只用于事件处理程序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    相关资源
    最近更新 更多