我目前正在使用Xamarin的免费试用版开发一个概念验证应用,但遇到了一个有趣的小问题...这是我在可移植类库中使用的代码:
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;
}
}
}
基本上,我只想调用一个Web服务并获得响应,但是我注意到使用Xamarin时无法使用老旧的
GetResponse()
方法来实现这一点,而必须使用BeginGetResponse()
和EndGetResponse()
,并采用旧的IAsyncResult
模式。问题出现了。无论如何,我的问题是,在等待
waitHandle
后,紧随其后的代码在回调代码之前执行,我不知道为什么。这正是我们使用等待句柄的原因!有谁能发现我肯定会犯的一个简单错误吗?
System.Net.Http.HttpClient
和async
/await
。这是在 Xamarin 中使用 Web 服务的常见方式,如教程中所示。 - WosiSystem.Net.Http
“不够成熟”是什么意思?它已经很稳定了,许多人都在他们的生产应用程序中使用它。 - WosiMicrosoft.Net.Http
。这里解释了它与System.Net.Http
的区别:https://dev59.com/SF0Z5IYBdhLWcg3wzC5W - Wosi