【发布时间】:2017-03-09 18:17:56
【问题描述】:
我有一个从远程服务器检索信息并将该信息显示给用户的屏幕。我希望在显示屏幕时更新此信息(无需额外的用户交互)。
public partial class MyPage : ContentPage
{
protected override async void OnAppearing()
{
base.OnAppearing();
try
{
MyLabel.Text = (await GoGetTheData ()).Stuff;
}
catch (Exception e)
{
MyLabel.Text = "Narg";
}
}
}
这可以接受吗?我已经看到了所有关于“async void”的弊端的讨论,以及它应该如何只用于事件处理程序,而这并不是一个事件处理程序。
在这种情况下,框架是否保证正常,因为我 (1) 在获取所有异步之前调用了 base.OnAppearing(),并且 (2) 捕获了我的异常?
【问题讨论】:
-
这个方法是怎么调用的?
-
这是可以接受的,因为这些覆盖与事件处理程序没有太大区别:它们的存在是为了通知派生类的实例有关某些事件。但是,您应该跟踪待处理的任务,例如
GoGetTheData。如果在前一个任务完成之前再次调用OnAppearing怎么办?如果您愿意,可以将其视为异步重入。 -
我更新了我的代码以表明这是对最初在 Xamarin.Forms.Page 中定义的“OnAppearing()”的覆盖。我知道在人们回答后更新代码通常是不好的形式,但我相信在这种情况下,我更新的代码绝不会使任何答案或其他讨论无效。
标签: c# asynchronous xamarin async-await