Что не так с этим методом асинхронной задачи? - PullRequest
5 голосов
/ 21 марта 2012

Это простая асинхронная задача, но у меня всегда возникают странные ошибки компилятора.Этот код из службы веб-API в проекте ASP.NET 4, созданный с помощью VS2010.

Даже ContinueWith (не универсальный) неявно возвращает Task, но эта ошибка все еще существует.

Код:

public class TestController : ApiController
{
       public Task<HttpResponseMessage> Test()
       {
            string url = "http://www.stackoverflow.com";
            var client = new HttpClient();

            return client.GetAsync(url).ContinueWith<HttpResponseMessage>((request) =>
            {
                // Error 361 'System.Threading.Tasks.Task' does not contain a definition
                // for 'Result' and no extension method 'Result' accepting a first argument
                // of type 'System.Threading.Tasks.Task' could be found
                // (are you missing a using directive or an assembly reference?)
                var response = request.Result;
                response.EnsureSuccessStatusCode();

                // Error 364 Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>' to 'System.Net.Http.HttpResponseMessage'
                return response.Content.ReadAsStringAsync().ContinueWith<HttpResponseMessage>((read) =>
                {
                    return new HttpResponseMessage();
                });
            });
        }
}

1 Ответ

5 голосов
/ 21 марта 2012

Ошибка 364 совершенно нормальна, потому что вы возвращаете Task<Task<HttpResponseMessage>> вместо Task<HttpResponseMessage>. Как только вы исправите ошибку 361, она также исчезнет.

Чтобы вы могли Unwrap результат:

public Task<HttpResponseMessage> Test()
{
    string url = "http://www.stackoverflow.com";
    var client = new HttpClient();
    return client.GetAsync(url).ContinueWith(request =>
    {
        var response = request.Result;
        response.EnsureSuccessStatusCode();
        return response.Content.ReadAsStringAsync().ContinueWith(t =>
        {
            var result = new HttpResponseMessage();
            response.CreateContent(t.Result);
            return response;
        });
    }).Unwrap();
}
...