У меня есть асинхронный метод 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); })
, и теперь она работает, и счетчик обновляется.
ExecuteWithRetryAsync
- person bigb055   schedule 11.01.2019ExecuteWithRetryAsync
- person FreakyAli   schedule 11.01.2019