Итак, я работаю с Xamarin.iOS и вызываю API, используя async / await. Кажется, я столкнулся с ситуацией, которую, похоже, не могу пройти.
У меня есть событие TouchUpInside кнопки, которое имеет асинхронный обработчик, и внутри обработчика я вызываю PerformSegue, когда определенное событие инициируется, но это не работает. В окне вывода я вижу, что создаются несколько потоков, и все остальные строки выполняются, как и ожидалось, однако действие PerformSegue выполняется, и оно остается в том же ViewController. Затем я читаю учебник по Xamarin по работе с потоками , где написано
Если асинхронный метод вызывается из фонового потока (не из основного интерфейса)
тогда) InvokeOnMainThread все равно будет необходим.
это тоже не работает.
с другой стороны, если я удалю async / await из своего кода и вызову PerformSegue в обработчике, тогда код будет работать как положено.
Может ли кто-нибудь помочь с разрешением этой ситуации и причиной, по которой это происходит. Спасибо
Здесь 'упрощенная версия кода:
public override void ViewDidLoad()
{
base.ViewDidLoad();
searchButton.TouchUpInside += SearchButton_TouchUpInside;
}
async private void SearchButton_TouchUpInside(object sender, EventArgs e)
{
var dictionary = new Dictionary<string, string>
{
{"searchText", "abc" }
};
searchItemsResult = await client.InvokeApiAsync<items>("search/searchitems", HttpMethod.Get, dictionary);
if (searchItemsResult != null)
{
//InvokeOnMainThread(() => //doesn't work with this
//{
//tried and doe work with this either
//DispatchQueue.MainQueue.DispatchAsync(() =>
//{
//doesn't push to new ViewController
this.PerformSegue("vC2Segue", this);
//});
//});
}
}