Я пытаюсь запустить задачу в моем асинхронном методе, но это выдает мне ошибку потока пользовательского интерфейса

#xamarin #xamarin.forms

#xamarin #xamarin.forms

Вопрос:

Вот что я пытаюсь сделать:

     public async void CreateListSectionAsync()
    {
        details.Children.Clear();
        details.Children.Add(new MessageGridTemplate()
        {
            Label = "Information",
            Text = "Fetching card details, please be patient"
        });
        await Task.Run(() =>
        {
            // modify the UI
            details.Children.Clear();
        });

    }
  

Но это выдает ошибку пользовательского интерфейса. Является ли способ, которым я вызываю задачу, неправильным?

Комментарии:

1. «ошибка пользовательского интерфейса» — какую конкретную ошибку она вам выдает?

Ответ №1:

ListView s или другие представления, которые сильно изменяют пользовательский интерфейс, ненавидят находиться в отдельном потоке. Поэтому, когда вы вызываете

 await Task.Run(() =>
{
    // modify the UI
    details.Children.Clear();
});
  

пользовательский интерфейс создаст исключение, потому что вы изменяете экран из потока, не связанного с пользовательским интерфейсом. Попробуйте вызвать details.Children.Clear на устройстве.Вызов BeginInvokeOnMainThread.

Даже простое добавление или удаление одного элемента не будет удачным в отдельном потоке / контексте.

Ответ №2:

Вы не можете изменять элементы пользовательского интерфейса из фонового потока.

Соответствующее смягчение нет Device.BeginInvokeOnMainThread . Более правильный подход зависит от того, какие обновления пользовательского интерфейса вы выполняете:

  • Чтобы отобразить результаты работы фонового потока, используйте await .
  • Чтобы отобразить ход выполнения или несколько результатов операции фонового потока, используйте Progress<T> / IProgress<T> .
  • Чтобы отображать обновления по мере отправки событий в ваше приложение, используйте SynchronizationContext или IObservable<T>.ObserveOn .