等待句柄和 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。当您尝试在主线程上同步等待异步方法的结果时,您可能会陷入无限循环。 当你做昂贵的事情时,使用 asyncawait。这是进行异步工作的常见模式。

看看一些教程:

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