我已经编写了一个从Web API获取json的通用异步方法
private static async Task<T> WebReq<T>(string url, string method)
{
// Init a HttpWebRequest for the call
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = method;
using (var memoryStream = new MemoryStream())
{
// Send request to the internet and wait for the response
using (var response = await httpWebRequest.GetResponseAsync())
{
// Get the datastream
using (var responseStream = response.GetResponseStream())
{
// Read bytes in the responseStream and copy them to the memoryStream
await responseStream.CopyToAsync(memoryStream);
}
}
// Read from the memoryStream
using (var streamReader = new StreamReader(memoryStream))
{
var result = await streamReader.ReadToEndAsync();
return JsonConvert.DeserializeObject<T>(result);
}
}
}
然后,我的所有方法都会使用这种通用方法来调用API,例如
public static async Task<Dictionary<string, string>> GetExampleDictAsync(string id)
{
string url = baseUrl + "GetExampleDictionary/" + id;
return await WebReq<Dictionary<string, string>>(url, "POST");
}
据我了解,这将创建2个任务。如果我每次都要写出WebReq的内容,那么每次调用它只能是1个任务...我怎样才能使用我的通用方法并且只启动一个任务?
是否像在没有等待的情况下返回WebReq一样简单?
答案 0 :(得分:4)
这对我来说很好,我可能不会改变它。如果您担心,可以将第二种方法的签名更改为:
public static Task<Dictionary<string, string>> GetExampleDictAsync(string id)
{
string url = baseUrl + "GetExampleDictionary/" + id;
return WebReq<Dictionary<string, string>>(url, "POST");
}
然后你只是返回你的内部方法创建的任务,你可以在调用者中等待 - 在这个方法中没有必要等待它,所以它不需要是异步的。
但是,如果此方法需要在调用WebReq
之后执行任何操作,那么它将从异步中受益,因此在更改之前我会考虑这一点。