创建事件是将 XF OnAppearing 变成异步方法的有效方法吗?

Ala*_*an2 7 c# xamarin xamarin.forms

我最近看到了这个关于如何将应用程序 OnStart 变成异步 OnStart 的建议:

    protected override void OnStart()
    {
        this.started += onStarted;      //Subscribe to event
        started(this, EventArgs.Empty); //Raise event
    }

    protected async void onStarted(object sender, EventArgs args)
    {
        try
        {
            await // do things
        }
        catch (Exception ex)
        {
            var ignore = ex;
        }
        this.started -= onStarted;
    }
Run Code Online (Sandbox Code Playgroud)

任何人都可以看到任何可能的问题,如果没有,那么类似的东西可以应用于 OnAppearing,如果是这样,是否需要进行任何更改。

Nko*_*osi 5

OnAppearing只是voidPage 类上的一个方法

Xamarin.Forms.Page

//...

protected virtual void OnAppearing()
{
}

//...
Run Code Online (Sandbox Code Playgroud)

来源

这被称为页面生命周期的一部分。

//...

[EditorBrowsable(EditorBrowsableState.Never)]
public void SendAppearing()
{
    if (_hasAppeared)
        return;

    _hasAppeared = true;

    if (IsBusy)
    {
        if (IsPlatformEnabled)
            MessagingCenter.Send(this, BusySetSignalName, true);
        else
            _pendingActions.Add(() => MessagingCenter.Send(this, BusySetSignalName, true));
    }

    OnAppearing(); //<---
    Appearing?.Invoke(this, EventArgs.Empty); //NOTE HOW ACTUAL EVENT IS RAISED AFTER

    var pageContainer = this as IPageContainer<Page>;
    pageContainer?.CurrentPage?.SendAppearing();

    FindApplication(this)?.OnPageAppearing(this);
}

//...
Run Code Online (Sandbox Code Playgroud)

来源

它们不会被误认为是事件处理程序,这是允许使用的一种异常async void

参考Async/Await - 异步编程的最佳实践

您的OnStart示例中显示的方法也可以应用于OnAppearing

例如

public partial class SomePage : ContentPage {
    public SomelPage() {
        InitializeComponent();
        appearing += onAppearing;
    }

    protected override void OnAppearing() {
        appearing(this, EventArgs.Empty);
        appearing -= onAppearing;
    }

    event EventHandler appearing = delegate { };

    private async void onAppearing(object sender, EventArgs args) {
        try {
            var locator = CrossGeolocator.Current;
            var position = await locator.GetPositionAsync();

            var places = await SomeService.getPlacesOfInterest(position.Latitude, position.Longitude);
            placesListView.ItemsSource = places;
        } catch( Exception ex) {
            //handler error (Log?)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以直接订阅实际 Appearing事件

//...

public event EventHandler Appearing;

//...
Run Code Online (Sandbox Code Playgroud)

来源

并放弃覆盖该OnAppearing()方法

public partial class SomePage : ContentPage {
    public SomelPage() {
        InitializeComponent();
        Appearing += onAppearing;
    }

    private async void onAppearing(object sender, EventArgs args) {
        try {
            var locator = CrossGeolocator.Current;
            var position = await locator.GetPositionAsync();

            var places = await SomeService.getPlacesOfInterest(position.Latitude, position.Longitude);
            placesListView.ItemsSource = places;
        } catch( Exception ex) {
            //handler error (Log?)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)