Xamarin.iOS PeformSegue не работает с Async / Await - PullRequest
2 голосов
/ 29 июня 2019

Итак, я работаю с 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); 
               //});
               //});
        }
}
...