Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步方法是否可以重写基类中的方法';Xamarin表单中是否不异步?_C#_Xamarin_Xamarin.forms - Fatal编程技术网

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);