#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
.