我想在异步事件侦听器方法中显示进度Dialog。现在,只有异步方法执行完毕后才能看到UI组件。这是我的代码:
@model DateTime
@if (Model.Date == new DateTime(1900, 1, 1))
{
@Html.TextBox("", "")
}
else
{
@Html.TextBox("", Model)
}
当我在异步方法之外调用方法async void process_Click(object sender, EventArgs e)
{
launchRingProgressDialog();
var comp = await Start();
}
public void launchRingProgressDialog()
{
Activity.RunOnUiThread(() =>
{
ProgressDialog ringProgressDialog = ProgressDialog.Show(Activity, "Processing", "Please wait", true);
ringProgressDialog.SetCancelable(true);
});
}
时,显示进度对话框,但在异步方法运行时则不显示。如何制作异步方法,以便它不会阻止UI组件?
修改
据我所知,异步方法在UI线程内部运行,因此不需要RunOnUiThread。我已经更改了我的代码,但我仍然面临同样的问题。
launchRingProgressDialog()
答案 0 :(得分:0)
在从UI线程调用的async
方法中运行UI代码时(例如按钮点击之类的UI事件,例如代码中的按钮点击),您不需要使用{ {1}}。这是因为当RunOnUiThread
ed await
完成时,该方法在调用线程上继续,在这种情况下是UI线程。
例如,查看以下代码,该代码是我的一个成功运行并具有所需结果的应用程序的一部分:
Task
点击时会显示private async void ExecuteSearchButton_Click(object sender, System.EventArgs e)
{
spinner.Visibility = ViewStates.Visible;
CollectionFeed feed = await CollectionFeed.SearchAsync(searchEditText.Text);
GenericAdapter<Collection, CollectionViewHolder> adapter =
new GenericAdapter<Collection, CollectionViewHolder>(Resource.Layout.CollectionRecyclerViewItem,
feed.Results, view => new CollectionViewHolder(view));
searchResultRecyclerView.SetAdapter(adapter);
spinner.Visibility = ViewStates.Gone;
}
,当数据加载到spinner
(也会成功加载)时,RecyclerView.Adapter
会消失。
您编辑的方法将是
public void launchRingProgressDialog()
{
ProgressDialog ringProgressDialog = ProgressDialog.Show(Activity, "Processing", "Please wait", true, true);
}
它使用this ProgressDialog
constructor删除SetCancelable
来电。