从回调到等待
Page类定义了三种方法,可以显示有时称为警报或消息框的可视对象。 这样的框在屏幕上弹出一些信息或用户的问题。 警报框是模态的,这意味着在显示警报时应用程序的其余部分不可用。 在返回与应用程序交互之前,用户必须通过按下按钮来解除它。
Page类的这三种方法中有两种名为DisplayAlert。 第一个只显示一些带有一个按钮的文本以关闭该框,而第二个包含两个按钮,用于是或否响应。 DisplayActionSheet方法类似,但显示任意数量的按钮。
在iOS,Android和Windows运行时,这些方法是使用特定于平台的对象实现的,这些对象使用事件或回调方法通知应用程序警报框已被解除以及用户按下哪个按钮来关闭它。 但是,Xamarin.Forms已使用异步接口包装这些对象。
Page类的这三个方法定义如下:
Task DisplayAlert (string title, string message, string cancel)
Task<bool> DisplayAlert (string title, string message, string accept, string cancel)
Task<string> DisplayActionSheet (string title, string cancel, string destruction,
params string[] buttons)
它们都返回Task对象。 Task和Task 类在System.Threading.Tasks命名空间中定义,它们构成了基于任务的异步模式的核心,称为TAP。 TAP是在.NET中处理异步操作的推荐方法。任务并行库(TPL)建立在TAP之上。
相比之下,WebRequest的BeginGetResponse和EndGetResponse方法代表了涉及IAsyncResult的异步操作的旧方法。这种较旧的方法称为异步编程模型或APM。您可能还会遇到使用基于事件的代码
异步模型(EAP)通过事件从异步作业返回信息。
您已经在第15章“交互式界面”中看到了SetTimer程序中最简单的DisplayAlert形式.SetTimer使用警报来指示计时器何时消失。该程序似乎并不关心DisplayAlert返回的Task对象,因为警报框仅用于通知目的。没有必要从用户那里获得响应。但是,返回Task 和Task 的方法需要将实际信息传回给应用程序,指示用户按下哪个按钮来解除警报。
Task 的返回值有时被称为“promise”。实际值或对象尚未可用,但如果没有出错,它将来可用。
您可以通过几种不同的方式使用Task 对象。这些方法基本上是等价的,但C#语法却完全不同。