Диалог хода выполнения не отображается на .Show () в асинхронном методе - PullRequest
0 голосов
/ 11 января 2019

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

1 Ответ

0 голосов
/ 11 января 2019

Причина, по которой ваш прогресс не крутится, состоит в том, что он не является неопределенным, добавьте следующий код, и он должен работать

 progress.Indeterminate = true;

 progress.SetProgressStyle(Android.App.ProgressDialogStyle.Spinner);

Обновление

Поставьте следующую строку

result = methodInfo?.Invoke(Utility.WsHueckmann, args) 

внутри ожидают Task.Run, поэтому он становится

await Task.Run(() => { result = methodInfo?.Invoke(Utility.WsHueckmann, args); }) 

и теперь он работает, а спиннер обновляется.

...