尝试将您的网络服务调用转换为async 和await。
根据您的结构,您可能必须使用TaskCompletionSource,如下例所示。
在这个例子中,当按钮被点击时,按钮不可见,ActivityIndicator被设置为IsRunning=True以显示它。
然后它使用TaskCompletionSource 在函数ExecuteSomeLongTask 中执行您长时间运行的任务/网络服务。
原因是在我们的按钮点击代码中,我们有最后几行:-
objActivityIndicator1.IsRunning = false;
objButton1.IsVisible = true;
停止ActivityIndicator 停止运行和显示,也将按钮设置回可见状态。
如果我们不使用TaskCompletionSource,这些行将在调用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;
}