У меня есть асинхронный метод ExecuteWithRetryAsync
, который реализует некоторую логику повторных попыток и должен показывать ProgressDialog, как только он вызывается. В настоящее время первый вызов Show()
действительно никогда не работает. Диалог хода выполнения отображается только после подтверждения AlertDialog
(второй комментарий). Как сделать, чтобы Show()
в начале ExecuteWithRetryAsync фактически отображал диалог прогресса?
public async Task<object> ExecuteWithRetryAsync(string methodName, object[] args)
{
MethodInfo methodInfo = typeof(Service1).GetMethod(methodName);
// below progress dialog not showing
mDialog = new ProgressDialog(context);
mDialog.SetMessage("Bitte warten...");
mDialog.SetCancelable(false);
mDialog.Show();
for (; ; )
{
try
{
object result = null;
try
{
// Call web service.
result = methodInfo?.Invoke(webservice, args);
}
catch (TargetInvocationException tie)
{
if (tie.InnerException != null) throw tie.InnerException;
}
mDialog?.Dismiss();
return result;
}
catch (Exception e)
{
Trace.TraceError("Operation Exception");
currentRetry++;
if (/*currentRetry > RetryCount || */!IsTransient(e))
{
// If this isn't a transient error or we shouldn't retry,
// rethrow the exception.
throw;
}
}
mDialog?.Dismiss();
await DisplayAlert(
context.GetString(Resource.String.timeout),
context.GetString(Resource.String.retry_operation),
context.GetString(Resource.String.Ok),
methodInfo);
// this progress dialog is showing
mDialog = new ProgressDialog(context);
mDialog.SetMessage("Bitte warten...");
mDialog.SetCancelable(false);
mDialog.Show();
await Task.Delay(MaxDelayMilliseconds);
}
}
ОБНОВЛЕНИЕ: Я заметил, что, когда подключение устройства отключено, ExecuteWithRetryAsync
начинает выполнение примерно за 10-15 секунд, а устройство показывает приложение, не отвечающее на диалог несколько раз, тогда как при соединение на нем выполняется немедленно. Почему это?
ОБНОВЛЕНИЕ 2: Когда я ставлю await Task.Delay (50)
после вызова Show (), он отображается, но анимация диалога прогресса не обновляется, она заморожена.
ОБНОВЛЕНИЕ 3: я поместил следующую строку result = methodInfo?.Invoke(Utility.WsHueckmann, args)
внутри await Task.Run, чтобы он стал await Task.Run(() => { result = methodInfo?.Invoke(Utility.WsHueckmann, args); })
, и теперь он работает, а спиннер обновляется.