Xamarin.iOS
Параллельное программирование в Xamarin.iOS
Поиск…
Управление пользовательским интерфейсом из фоновых потоков
Фоновые потоки не могут изменять пользовательский интерфейс; почти все методы UIKit должны быть вызваны в основной поток.
Из подкласса NSObject
(включая любой UIViewController
или UIView
):
InvokeOnMainThread(() =>
{
// Call UI methods here
});
Из стандартного класса C #:
UIApplication.SharedApplication.InvokeOnMainThread(() =>
{
// Call UI methods here
});
InvokeOnMainThread
ждет, пока ваш код будет запущен в основном потоке для выполнения перед продолжением. Если вам не нужно ждать, используйте BeginInvokeOnMainThread
.
Использование Async и ожидание
Вы можете использовать методы async для обработки асинхронных исполнений. Например, запросы POST и GET. Скажем ниже, это ваш метод получения данных.
Task<List> GetDataFromServer(int type);
Вы можете вызвать этот метод, как показано ниже
var result = await GetDataFromServer(1);
Однако в реальной практике этот метод будет находиться в интерфейсе уровня сервиса. Там лучший способ сделать это - создать отдельный метод для вызова этого и обновить пользовательский интерфейс, показанный ниже.
//Calling from viewDidLoad
void async ViewDidLoad()
{
await GetDataListFromServer(1);
//Do Something else
}
//New method call to handle the async task
private async Task GetArchivedListFromServer(int type)
{
var result = await GetDataFromServer(type);
DataList.AddRange(result.toList());
tableView.ReloadData();
}
В приведенном выше фрагменте кода будет вызван метод GetDataListFromServer и он отправит веб-запрос. Тем не менее, он не будет блокировать поток пользовательского интерфейса, пока он не получит ответ от сервера. Он будет двигаться вниз по линии после await GetDataListFromServer(1)
. Однако внутри метода private async Task GetArchivedListFromServer(int type)
он будет ждать, пока он получит ответ от сервера, чтобы выполнить строки после того, как var result = await GetDataFromServer(type);
,