创建事件是否是将XF OnAppearing转换为异步方法的有效方法



我最近看到了关于如何将应用程序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;
}

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

OnAppearing只是Page类上的void方法

Xamarin.Forms.Page

//...
protected virtual void OnAppearing()
{
}
//...

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

//...
[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);
}
//...

它们不能被误认为是事件处理程序,这是允许使用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?)
}
}
}

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

//...
public event EventHandler Appearing;
//...

放弃覆盖CCD_ 7方法

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?)
}
}
}

最新更新