尝试将您的网络服务调用变成一个async
和await
它。
根据您构建事物的方式,您可能必须使用 a TaskCompletionSource
,如下例所示。
在此示例中,当单击按钮时,按钮变为不可见,并ActivityIndicator
设置IsRunning=True
为显示它。
然后它ExecuteSomeLongTask
使用TaskCompletionSource
.
原因是在我们的按钮点击代码中,我们有最后几行:-
objActivityIndicator1.IsRunning = false;
objButton1.IsVisible = true;
停止ActivityIndicator
运行和显示,并将按钮设置回可见状态。
如果我们不使用 aTaskCompletionSource
这些行将在调用后立即执行ExecuteSomeLongTask
如果它是一个正常的异步方法/函数,并会导致ActivityIndicator
不运行并且按钮仍然可见。
例子:-
Grid objGrid = new Grid()
{
};
ActivityIndicator objActivityIndicator1 = new ActivityIndicator();
objGrid.Children.Add(objActivityIndicator1);
Button objButton1 = new Button();
objButton1.Text = "Execute webservice call.";
objButton1.Clicked += (async (o2, e2) =>
{
objButton1.IsVisible = false;
objActivityIndicator1.IsRunning = true;
//
bool blnResult = await ExecuteSomeLongTask();
//
objActivityIndicator1.IsRunning = false;
objButton1.IsVisible = true;
});
objGrid.Children.Add(objButton1);
return objGrid;
支持功能:-
private Task<bool> ExecuteSomeLongTask()
{
TaskCompletionSource<bool> objTaskCompletionSource1 = new TaskCompletionSource<bool>();
//
Xamarin.Forms.Device.StartTimer(new TimeSpan(0, 0, 5), new Func<bool>(() =>
{
objTaskCompletionSource1.SetResult(true);
//
return false;
}));
//
return objTaskCompletionSource1.Task;
}