Я хочу показать прогресс Диалог внутри метода прослушивания async-событий. Прямо сейчас, компонент пользовательского интерфейса отображается только после завершения асинхронного метода. Вот мой код:показ прогресса Диалог внутри асинхронного метода
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);
});
}
Прогресс Диалог показывает, когда я вызываю метод launchRingProgressDialog()
вне метода асинхронного, но не в то время как метод асинхронного работает. Как сделать метод async, чтобы он не блокировал компонент пользовательского интерфейса?
Редактировать
Как я понимаю, метод асинхронного работает в потоке пользовательского интерфейса, так RunOnUiThread не требуется. Я изменил свой код, как показано ниже, но я все еще сталкиваюсь с той же проблемой.
async void process_Click(object sender, EventArgs e)
{
ringProgressDialog = ProgressDialog.Show(Activity, "Processing", "Please wait", true);
var comp = await Start();
ringProgressDialog.Dismiss();
}
Я понимаю, что метод async работает внутри потока пользовательского интерфейса, и мне не нужно RunOnUiThread. Я запускаю диалог перед запуском операции async и отклоняя его после ожидания Task, но это не работает. диалог или любой другой компонент пользовательского интерфейса становится видимым только после завершения всего асинхронного метода. Может быть, я должен начать новый поток внутри метода async и запустить внутри него операцию async? –
@AhmedMujtaba Если я изменю свой код, который я разместил в качестве примера, чтобы включить «ProgressDialog», он появляется и уволен в нужное время. Является ли ваша операция «асинхронной» короткой продолжительностью (<1 секунда)? Если это так, это может быть причиной, потому что когда метод «асинхронный» вызывается в первый раз после запуска приложения, Xamarin вызывает небольшую паузу в приложении. – EvilTak
Я разрешил его, запустив операцию async внутри Task.Run. У меня есть еще одна небольшая проблема. Я хотел начать новый ProgressDiaglog после первого отклонения, но второй диалог появляется только после завершения асинхронного метода. Это потому, что в потоке пользовательского интерфейса слишком много активности, и он блокирует другие операции пользовательского интерфейса? –