如果你负担得起从 Alpha 通道运行 Xamarin.iOS,则可以访问 C#5 async/await。它很好地隐藏了任务和回调的复杂性。
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
muButton.TouchUpInside += DoSomething;
}
async void DoSomething (object o, EventArge e)
{
myLabel.Text = "Starting";
for (var i = 0; i<10;i++)
{
await ProcessPart(i);
myLabel.Text = String.Format ("Progress : {i}0%", i+1);
}
myLabel.Text = "Done";
}
Task ProcessPart (int i)
{
Task.Delay (1000);
}
如果您的处理足够智能以报告自己的进度,则可以将其签名更改为IEnumerable<Task<int>> Process ()
并具有一个不错的刷新循环,例如:
async void DoSomething (object o, EventArge e)
{
foreach (var tp in Process())
myLabel.Text = String.Format ("Progress : {i}0%", await tp +1);
}
一个虚拟的 Process() 函数可能如下所示:
IEnumerable<Task<int>> Process ()
{
for (var i=0; i<10; i++)
yield return Task.Delay (1000).ContinueWith(x => i);
}