Edit: Cette question semble être le même problème, mais n'a pas de réponses ...
Edit: dans le cas de test 5, la tâche semble bloquée WaitingForActivation.
J'ai rencontré un comportement étrange en utilisant System.Net.Http.HttpClient dans .NET 4.5 - où "attendre" le résultat d'un appel à (par exemple) httpClient.GetAsync(...)ne reviendra jamais.
Cela ne se produit que dans certaines circonstances lors de l'utilisation de la nouvelle fonctionnalité de langage asynchrone / attente et de l'API Tâches - le code semble toujours fonctionner lorsque vous utilisez uniquement des continuations.
Voici un code qui reproduit le problème - déposez-le dans un nouveau "projet MVC 4 WebApi" dans Visual Studio 11 pour exposer les points de terminaison GET suivants:
/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6Chacun des points de terminaison renvoie ici les mêmes données (les en-têtes de réponse de stackoverflow.com), sauf pour ceux /api/test5qui ne se terminent jamais.
Ai-je rencontré un bogue dans la classe HttpClient ou suis-je en train de mal utiliser l'API d'une manière ou d'une autre?
Code à reproduire:
public class BaseApiController : ApiController
{
    /// <summary>
    /// Retrieves data using continuations
    /// </summary>
    protected Task<string> Continuations_GetSomeDataAsync()
    {
        var httpClient = new HttpClient();
        var t = httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);
        return t.ContinueWith(t1 => t1.Result.Content.Headers.ToString());
    }
    /// <summary>
    /// Retrieves data using async/await
    /// </summary>
    protected async Task<string> AsyncAwait_GetSomeDataAsync()
    {
        var httpClient = new HttpClient();
        var result = await httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);
        return result.Content.Headers.ToString();
    }
}
public class Test1Controller : BaseApiController
{
    /// <summary>
    /// Handles task using Async/Await
    /// </summary>
    public async Task<string> Get()
    {
        var data = await Continuations_GetSomeDataAsync();
        return data;
    }
}
public class Test2Controller : BaseApiController
{
    /// <summary>
    /// Handles task by blocking the thread until the task completes
    /// </summary>
    public string Get()
    {
        var task = Continuations_GetSomeDataAsync();
        var data = task.GetAwaiter().GetResult();
        return data;
    }
}
public class Test3Controller : BaseApiController
{
    /// <summary>
    /// Passes the task back to the controller host
    /// </summary>
    public Task<string> Get()
    {
        return Continuations_GetSomeDataAsync();
    }
}
public class Test4Controller : BaseApiController
{
    /// <summary>
    /// Handles task using Async/Await
    /// </summary>
    public async Task<string> Get()
    {
        var data = await AsyncAwait_GetSomeDataAsync();
        return data;
    }
}
public class Test5Controller : BaseApiController
{
    /// <summary>
    /// Handles task by blocking the thread until the task completes
    /// </summary>
    public string Get()
    {
        var task = AsyncAwait_GetSomeDataAsync();
        var data = task.GetAwaiter().GetResult();
        return data;
    }
}
public class Test6Controller : BaseApiController
{
    /// <summary>
    /// Passes the task back to the controller host
    /// </summary>
    public Task<string> Get()
    {
        return AsyncAwait_GetSomeDataAsync();
    }
}HttpClient.GetAsync(...)?