Попробуйте сделать вызов вашего веб-сервиса async
и await
.
В зависимости от того, как вы структурировали вещи, вам, возможно, придется использовать TaskCompletionSource
, как показано в следующем примере.
В этом примере, когда кнопка нажата, она становится невидимой, а для ActivityIndicator
устанавливается значение IsRunning=True
, чтобы показать ее.
Затем он выполняет вашу длительную задачу / веб-сервис в функции ExecuteSomeLongTask
, используя TaskCompletionSource
.
Причина этого в том, что в нашем коде нажатия кнопки у нас есть последние строки: -
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;
}
person
Pete
schedule
15.02.2016