Как сделать Http-запрос в фоновом режиме и показать результат, как только он будет выполнен?

Я создаю приложение для Android с Xamarin, которое получает данные из API Riot Games и отображает их для пользователя. Я хочу, чтобы HTTP-запрос выполнялся в фоновом режиме и обновлял пользовательский интерфейс, как только он будет выполнен. Я попытался использовать ThreadPool.QueueUserWorkItem(), но он немедленно выполняет приведенный ниже код, и я хочу, чтобы он дождался, пока он не захватит данные. Это код моей переносимой библиотеки классов.

 public void GetSummonerInformation()
        {
            try
            {
                    HttpResponseMessage response = httpClient.GetAsync(url).Result;
                    response.EnsureSuccessStatusCode();
                    string result = response.Content.ReadAsStringAsync().Result;

                    var data = JsonConvert.DeserializeObject<Dictionary<string, App2.Models.SummonerDto>>(result);

                    var name1 = data.First().Value.name;
                    var id = data.First().Value.id;
                    var profileIconId1 = data.First().Value.profileIconId;
                    var revisionDate1 = data.First().Value.revisionDate;
                    sumId = id;
                    sumName1 = name1;
                    sumProfileIconId = profileIconId1;
                    sumRevisionDate = revisionDate1;
                    System.Diagnostics.Debug.WriteLine("{0} this is the  {1}", data.First().Value.name, data.First().Value.profileIconId);

            }catch(Exception ex)
            { System.Diagnostics.Debug.WriteLine(ex.Message); }

и это мой код на моем Android mainactivity.cs

button2nd.Click += delegate
           {
                   //Runs the http request on a background thread so the application doesnt hang.Need to make the code after that to wait for the request to end and then exexute
                   //because it gives me a blank icon and i need to press the button again.
               ThreadPool.QueueUserWorkItem(o => mclass.GetSummonerInformation());
               System.Diagnostics.Debug.WriteLine(MyClass.sumProfileIconId);
               iconUrl = string.Format("http://ddragon.leagueoflegends.com/cdn/6.24.1/img/profileicon/" + MyClass.sumProfileIconId + ".png");
               DisplaySummonerIcon();
               DisplaySummonerInformation();
}

Спасибо!

2 ответа

Изменить:

ThreadPool.QueueUserWorkItem(o => mclass.GetSummonerInformation());

С:

await Task.Run(() => mclass.GetSummonerInformation());

И добавьте ключевое слово "async" перед "делегатом";

Вы используете асинхронные API (HttpClient), так что вы должны использовать await:

public async Task GetSummonerInformationAsync()
{
  try
  {
    HttpResponseMessage response = await httpClient.GetAsync(url);
    response.EnsureSuccessStatusCode();
    string result = await response.Content.ReadAsStringAsync();
    var data = JsonConvert.DeserializeObject<Dictionary<string, App2.Models.SummonerDto>>(result);
    ...
    System.Diagnostics.Debug.WriteLine("{0} this is the  {1}", data.First().Value.name, data.First().Value.profileIconId);
  }
  catch(Exception ex)
  {
    System.Diagnostics.Debug.WriteLine(ex.Message);
  }
}

вызывается как таковой:

button2nd.Click += async (_, __) =>
{
  await mclass.GetSummonerInformationAsync();
  System.Diagnostics.Debug.WriteLine(MyClass.sumProfileIconId);
  iconUrl = string.Format("http://ddragon.leagueoflegends.com/cdn/6.24.1/img/profileicon/" + MyClass.sumProfileIconId + ".png");
  DisplaySummonerIcon();
  DisplaySummonerInformation();
};

Для получения дополнительной информации о async а также await Посмотрите мой блог.

Другие вопросы по тегам