2016-07-09 3 views
2

Я хочу показать прогресс Диалог внутри метода прослушивания 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(); 

     } 

ответ

0

При выполнении кода пользовательского интерфейса в качестве async метода, который вызывается из потока пользовательского интерфейса (для событий примера пользовательского интерфейса, как при нажатии кнопок, как тот, который вы имеете в своем коде), вам не нужно использовать RunOnUiThread. Это связано с тем, что когда await ed 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 вызова.

+0

Я понимаю, что метод async работает внутри потока пользовательского интерфейса, и мне не нужно RunOnUiThread. Я запускаю диалог перед запуском операции async и отклоняя его после ожидания Task, но это не работает. диалог или любой другой компонент пользовательского интерфейса становится видимым только после завершения всего асинхронного метода. Может быть, я должен начать новый поток внутри метода async и запустить внутри него операцию async? –

+0

@AhmedMujtaba Если я изменю свой код, который я разместил в качестве примера, чтобы включить «ProgressDialog», он появляется и уволен в нужное время. Является ли ваша операция «асинхронной» короткой продолжительностью (<1 секунда)? Если это так, это может быть причиной, потому что когда метод «асинхронный» вызывается в первый раз после запуска приложения, Xamarin вызывает небольшую паузу в приложении. – EvilTak

+0

Я разрешил его, запустив операцию async внутри Task.Run. У меня есть еще одна небольшая проблема. Я хотел начать новый ProgressDiaglog после первого отклонения, но второй диалог появляется только после завершения асинхронного метода. Это потому, что в потоке пользовательского интерфейса слишком много активности, и он блокирует другие операции пользовательского интерфейса? –

Смежные вопросы