异步方法中的 .Show() 上未显示进度对话框
Progress Dialog not showing on .Show() in Async method
我有异步方法 ExecuteWithRetryAsync
,它实现了一些重试逻辑并且必须在调用时立即显示 ProgressDialog。目前,对 Show()
的第一次调用从未真正起作用。进度对话框仅在 AlertDialog
被确认后显示(第二条评论)。如何让 ExecuteWithRetryAsync 开头的 Show()
实际显示进度对话框?
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 秒才能开始执行,同时设备显示 app 没有响应对话框 多次,而连接上它会立即执行。为什么?
更新 2:当我在调用 Show() 之后放置 await Task.Delay (50)
时它确实显示了,但是进度对话框动画没有更新,它被冻结了。
更新 3:我将下面的行 result = methodInfo?.Invoke(Utility.WsHueckmann, args)
放在 await Task.Run 中,所以它变成了 await Task.Run(() => { result = methodInfo?.Invoke(Utility.WsHueckmann, args); })
现在它正在工作并且微调器正在更新。
你的进度不旋转的原因是因为它不是不确定的添加以下代码并且它应该工作
progress.Indeterminate = true;
progress.SetProgressStyle(Android.App.ProgressDialogStyle.Spinner);
更新
输入以下行
result = methodInfo?.Invoke(Utility.WsHueckmann, args)
在 await Task.Run 里面,所以它变成了
await Task.Run(() => { result = methodInfo?.Invoke(Utility.WsHueckmann, args); })
现在它正在运行并且微调器正在更新。
我有异步方法 ExecuteWithRetryAsync
,它实现了一些重试逻辑并且必须在调用时立即显示 ProgressDialog。目前,对 Show()
的第一次调用从未真正起作用。进度对话框仅在 AlertDialog
被确认后显示(第二条评论)。如何让 ExecuteWithRetryAsync 开头的 Show()
实际显示进度对话框?
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 秒才能开始执行,同时设备显示 app 没有响应对话框 多次,而连接上它会立即执行。为什么?
更新 2:当我在调用 Show() 之后放置 await Task.Delay (50)
时它确实显示了,但是进度对话框动画没有更新,它被冻结了。
更新 3:我将下面的行 result = methodInfo?.Invoke(Utility.WsHueckmann, args)
放在 await Task.Run 中,所以它变成了 await Task.Run(() => { result = methodInfo?.Invoke(Utility.WsHueckmann, args); })
现在它正在工作并且微调器正在更新。
你的进度不旋转的原因是因为它不是不确定的添加以下代码并且它应该工作
progress.Indeterminate = true;
progress.SetProgressStyle(Android.App.ProgressDialogStyle.Spinner);
更新
输入以下行
result = methodInfo?.Invoke(Utility.WsHueckmann, args)
在 await Task.Run 里面,所以它变成了
await Task.Run(() => { result = methodInfo?.Invoke(Utility.WsHueckmann, args); })
现在它正在运行并且微调器正在更新。