等待句柄和 Xamarin 表单
Wait Handles and Xamarin Forms
我目前正在使用 Xamarin 免费试用版进行概念验证应用程序,我遇到了一个相当有趣的小问题...这是我在便携式 Class 库中使用的代码:
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
之后的代码在回调中的代码之前执行,我不明白为什么。这正是我们拥有等待句柄的目的!
任何人都可以发现我确信会证明是一个简单错误的简单错误吗?
在 Windows Phone 上,您被迫使用异步 API。当您尝试在主线程上同步等待异步方法的结果时,您可能会陷入无限循环。
当你做昂贵的事情时,使用 async
和 await
。这是进行异步工作的常见模式。
看看一些教程:
https://visualstudiomagazine.com/articles/2013/10/01/asynchronous-operations-with-xamarin.aspx
How to implement Android callbacks in C# using async/await with Xamarin or Dot42?
我目前正在使用 Xamarin 免费试用版进行概念验证应用程序,我遇到了一个相当有趣的小问题...这是我在便携式 Class 库中使用的代码:
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
之后的代码在回调中的代码之前执行,我不明白为什么。这正是我们拥有等待句柄的目的!
任何人都可以发现我确信会证明是一个简单错误的简单错误吗?
在 Windows Phone 上,您被迫使用异步 API。当您尝试在主线程上同步等待异步方法的结果时,您可能会陷入无限循环。
当你做昂贵的事情时,使用 async
和 await
。这是进行异步工作的常见模式。
看看一些教程:
https://visualstudiomagazine.com/articles/2013/10/01/asynchronous-operations-with-xamarin.aspx
How to implement Android callbacks in C# using async/await with Xamarin or Dot42?