繁体   English   中英

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

[英]WebClient.OpenReadCompleted - how to wait for this event to finish

因此,非常高兴,我正在创建一个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)

我建议您是否要等待,而不是通过转换与async竞争的方法来利用Task并等待,如下所示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM