2012-03-21 26 views
5

Esto es solo una simple tarea asíncrona pero siempre tengo extraños errores de compilación. Este código de un servicio API web en un proyecto ASP.NET 4, creado con VS2010.¿Qué pasa con este método de tarea asincrónico?

Incluso ContinueWith (no genérico) devuelve la tarea implícitamente, pero este error todavía existe.

Código:

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(); 
       }); 
      }); 
     } 
} 

Respuesta

5

El error 364 es perfectamente normal, porque va a devolver un Task<Task<HttpResponseMessage>> en lugar de Task<HttpResponseMessage>. Una vez que lo arregles, el error 361 también desaparecerá.

por lo que podría Unwrap el resultado:

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(); 
} 
+0

Gracias, lo terriblemente olvidó que el valor de retorno estaba envuelto en una tarea de <> para cada ContinueWidth. Su código está compilado ahora, pero no estoy seguro de que todavía funcione como esperaba: el hilo estará libre por un tiempo durante la ejecución del cliente.¿GetAsync y response.Content.ReadAsStringAsync calls? –

+0

@Tiendq, he actualizado mi respuesta con un mejor ejemplo usando 'Unwrap'. Esto asegurará que el hilo de trabajo estará libre durante la ejecución de la solicitud HTTP. –