在异步方法中显示进度对话框

时间:2016-07-09 08:58:06

标签: c# android asynchronous

我想在异步事件侦听器方法中显示进度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()

1 个答案:

答案 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来电。