2015-08-27 5 views
3

В настоящее время я работаю над доказательством применения концепции с использованием бесплатной пробной версии Xamarin, и я столкнулся с довольно интересной небольшой проблемой ... Вот код, который я использую в портативной библиотеке классов:Wait Handles and Xamarin Forms

using System; 
using System.Net; 
using Newtonsoft.Json; 

namespace poc 
{ 
    public class CurrentWeatherInformation 
    { 

     public string WeatherText { get; set; } 

     public CurrentWeatherInformation (string cityName) 
     { 
      // api.openweathermap.org/data/2.5/weather?q=Leeds 
      var request = (HttpWebRequest)WebRequest.Create(string.Format("http://api.openweathermap.org/data/2.5/weather?q={0}", cityName)); 
      request.ContentType = "application/json"; 
      request.Method = "GET"; 
      object state = request; 

      var ar = request.BeginGetResponse (WeatherCallbackMethod, state); 
      var waitHandle = ar.AsyncWaitHandle as System.Threading.ManualResetEvent; 

      waitHandle.WaitOne(); 
     } 

     public void WeatherCallbackMethod(IAsyncResult ar) 
     { 
      object state = ar.AsyncState; 
      var request = state as HttpWebRequest; 
      var response = request.EndGetResponse(ar); 
      var data = new System.IO.StreamReader (response.GetResponseStream()).ReadToEnd(); 
      this.WeatherText = data; 
     } 

    } 
} 

по сути, я просто хочу, чтобы позвонить против WebService и получить ответ, но я с Xamarin отметить, что я не в состоянии сделать это, используя хороший метод старый GetResponse(), и должны использовать BeginGetResponse() и EndGetResponse() вместо этого, с старый IAsyncResult рисунок. Shizzle.

В любом случае, моя проблема заключается в том, что код, следующий за моим ожиданием на waitHandle, выполняется перед кодом в обратном вызове, и я не понимаю, почему. Это именно то, что у нас есть для ручки ожидания!

Может ли кто-нибудь определить, что я уверен, окажется простой ошибкой простака?

ответ

2

На Windows Phone вы вынуждены использовать асинхронный API. Когда вы пытаетесь дождаться результата асинхронного метода синхронно в основном потоке, вы можете оказаться в бесконечном цикле. Используйте async и await, когда вы делаете дорогие вещи. Это обычная схема для асинхронной работы.

Взгляните на некоторые учебники:

https://visualstudiomagazine.com/articles/2013/10/01/asynchronous-operations-with-xamarin.aspx

http://developer.xamarin.com/recipes/android/web_services/consuming_services/call_a_rest_web_service/

How to implement Android callbacks in C# using async/await with Xamarin or Dot42?

https://github.com/conceptdev/xamarin-forms-samples/blob/master/HttpClient/HttpClientDemo/GeoNamesWebService.cs

+0

Проблема заключается в том, что (и я с поправками на мой вопрос, соответственно) код Я показал, что вы находитесь в переносной библиотеке классов, что означает, что GetRes ponseAsync и т. д. недоступен. Буквально единственный вариант, который у меня есть, - BeginGetResponse и EndGetResponse ... –

+1

Нет, у вас есть больше возможностей. Вы можете использовать 'System.Net.Http.HttpClient' с' async'/'await'. Это обычный способ в Xamarin для comsume webservices, как показано в учебниках. – Wosi

+0

Спасибо, я дам вам вихрь и вернусь к вам ... –