WebClient.OpenReadCompleted - 如何等待此事件完成

时间:2015-05-12 11:56:04

标签: c# webclient bing-maps

所以基本上,我正在创建一个dll项目,必须从bing maps api获取一些信息。下面我粘贴了一个方法,该方法可用于获取和序列化响应:

private void GetResponse(Uri uri, Action<Response> callback)
    {
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += (o, a) =>
        {
            if (callback != null)
            {
                DataContractJsonSerializer responseSerializer = new DataContractJsonSerializer(typeof(Response));
                callback(responseSerializer.ReadObject(a.Result) as Response);
            }
        };
        wc.OpenReadAsync(uri);
    }

下面的方法是使用GetResponse方法获得晶格:

public Lattitudes getLattitudes()
    {
        Lattitudes lattitudes = new Lattitudes();
        GetResponse(geocodeRequestURI, (x) =>
        {
            lattitudes.SouthLatitude = x.ResourceSets[0].Resources[0].BoundingBox[0];
            lattitudes.SouthLatitude = x.ResourceSets[0].Resources[0].BoundingBox[1];
            lattitudes.SouthLatitude = x.ResourceSets[0].Resources[0].BoundingBox[2];
            lattitudes.SouthLatitude = x.ResourceSets[0].Resources[0].BoundingBox[3];
        });
        return lattitudes;
    } 

我的问题是第二个方法是返回空对象,GetResponse方法中的部分正在执行。有没有办法等待这个事件完成然后返回,或者我需要重新设计它?(我可以使用的最大版本的.NET是4.0)

1 个答案:

答案 0 :(得分:3)

我建议您是否要等待使用Task转换方法与async竞争,并等待如下所示

private async Task RequestDataAsync(string uri, Action<string> action)
{
    var client = new WebClient();
    string data = await client.OpenReadAsync(uri);
    action(data);
}

来自代码的调用方法

   Task t = RequestDataAsync(parameter)
   t.Wait();

此更多帮助:http://www.dotnetperls.com/async