包装任务以转换其返回值

时间:2014-09-28 21:25:36

标签: c# task-parallel-library async-await

SendAsync的{​​{1}}方法会返回HttpClient

我要做的是让Task<HttpResponseMessage>包装此任务并将响应转换为Task<T>的实例。例如,如果我希望响应包含T的JSON表示,我会这样:

SomeCustomObject

我似乎无法实现这一点。

2 个答案:

答案 0 :(得分:1)

沿着这些方向的东西可能会削减芥末:

public async Task<T> GetAsT<T> (HttpRequestMessage request)
{
    HttpResponseMessage apiCall = await Client.SendAsync(request);
    string data = await apiCall.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<T>(data);
}

或者如果你想阻止方法内部并且没有消费者等待它:

public T GetAsT<T> (HttpRequestMessage request)
{
    HttpResponseMessage apiCall = Client.SendAsync(request).Result;
    string data = apiCall.Content.ReadAsStringAsync().Result;
    return JsonConvert.DeserializeObject<T>(data);
}

答案 1 :(得分:0)

我会做这样的事情

public static class HttpRequestMessageExtensions
{
    public static async Task<T> GetAsT<T>(this HttpRequestMessage request)
    {
        using (var client = new HttpClient())
        {
            var response = await client.SendAsync(request);
            return await response.Content.ReadAsAsync<T>();
        }
    }
}

并像

一样使用它
var obj = new HttpRequestMessage(...).GetAsT<SomeCustomObject>();