我刚刚开始学习可湿性粉剂编程,所以这可能是一个小愚蠢的问题…
我正在开发的应用程序,从一个网络服务获取数据的几个不同的方法。因此,我决定将所有这些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");那么这有什么问题呢,我得到了编译器错误:'await‘操作符只能在异步方法中使用。请考虑使用“async”修饰符标记此方法,并将其返回类型更改为“Task”。
欢迎所有的建议。
发布于 2013-06-14 02:03:30
确保你的"main app“代码中的方法也有"async”修饰符:
public async Task GetAddress()
{
WebApiWorker webApi = new WebApiWorker();
var geoResponse = await webApi.GetGeocodeAsync("address");
}发布于 2013-06-14 02:06:38
这个问题的答案稍微取决于你想从响应中得到什么。您要立即使用结果吗?如果是这样,那么您实际上根本就没有使用异步功能,而是可以创建另一个同步版本的函数。如果您的调用函数打算稍后继续,那么按照Chris (和您的编译器)所说的做;使调用函数异步。
的确,根调用者最终不需要是异步的;通常情况下,它将是一个不返回任何内容的void方法。(实际上,上述void将在异步函数之前返回)
https://stackoverflow.com/questions/17090823
复制相似问题