4

我刚刚开始学习 WP 编程,所以这可能是个小问题......

我正在开发从一种 Web 服务获取数据的应用程序,这种方法很少有不同的方法。所以我决定将所有这些 Web 服务获取代码放到一个类中:

class WebApiWorker
{
    public async Task<List<GeocodeResponse>> GetGeocodeAsync(String address)
    {
        String url = "http://api.com&search=" + HttpUtility.UrlEncode(address) + "&format=json";

        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.Method = "GET";

        HttpWebResponse response = (HttpWebResponse) await httpWebRequest.GetResponseAsync();

        Stream responseStream = response.GetResponseStream();
        string data;

        using (var reader = new System.IO.StreamReader(responseStream))
        {
            data = reader.ReadToEnd();
        }
        responseStream.Close();

        var geocodeResponse = JsonConvert.DeserializeObject<List<GeocodeResponse>>(data);
        return geocodeResponse;

    }
}

但是我应该如何从我的“主应用程序”代码中调用它,我正在尝试这样的事情:

WebApiWorker webApi = new WebApiWorker();
var geoResponse = await webApi.GetGeocodeAsync("address");

所以这有什么问题,我得到编译器错误:“等待”运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。

欢迎所有建议。

4

2 回答 2

4

确保您的“主应用程序”代码中的方法也具有“异步”修饰符:

public async Task GetAddress()
{
    WebApiWorker webApi = new WebApiWorker();
    var geoResponse = await webApi.GetGeocodeAsync("address");
}
于 2013-06-13T18:03:30.297 回答
0

这个问题的答案稍微取决于你想从响应中得到什么。您要立即使用结果吗?如果是这样,那么您根本就没有真正使用异步功能,并且可以制作另一个同步的函数版本。如果您的调用函数打算稍后继续,那么按照克里斯(和您的编译器)所说的那样做;使调用函数异步。

确实,最终,根调用者将需要不是异步的;通常,该方法将是一个不返回任何内容的 void 方法。(事实上​​,说 void 会在你的异步函数之前返回)

于 2013-06-13T18:06:38.123 回答