使用调用另一个Task方法的异步Task方法 - 可能只使用一个任务?

时间:2017-12-11 11:43:55

标签: c# asynchronous task-parallel-library

我已经编写了一个从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一样简单?

1 个答案:

答案 0 :(得分:4)

这对我来说很好,我可能不会改变它。如果您担心,可以将第二种方法的签名更改为:

public static Task<Dictionary<string, string>> GetExampleDictAsync(string id)
{
    string url = baseUrl + "GetExampleDictionary/" + id;
    return WebReq<Dictionary<string, string>>(url, "POST");
}

然后你只是返回你的内部方法创建的任务,你可以在调用者中等待 - 在这个方法中没有必要等待它,所以它不需要是异步的。

但是,如果此方法需要在调用WebReq之后执行任何操作,那么它将从异步中受益,因此在更改之前我会考虑这一点。