Edita: Diese Frage sieht so aus, als ob es sich um dasselbe Problem handeln könnte, hat aber keine Antworten...
Edita: Im Testfall 5 scheint die Aufgabe in der folgenden Situation stecken zu bleiben WaitingForActivation
Zustand.
Ich habe einige seltsame Verhalten mit dem System.Net.Http.HttpClient in .NET 4.5 - wo "warten" das Ergebnis eines Aufrufs an (z. B.) gefunden. httpClient.GetAsync(...)
wird niemals zurückkehren.
Dies tritt nur unter bestimmten Umständen auf, wenn die neue async/await-Sprachfunktionalität und die Tasks-API verwendet werden - der Code scheint immer zu funktionieren, wenn nur Fortsetzungen verwendet werden.
Hier ist etwas Code, der das Problem reproduziert - legen Sie diese in ein neues "MVC 4 WebApi-Projekt" in Visual Studio 11, um die folgenden GET-Endpunkte freizugeben:
/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
Jeder der Endpunkte hier gibt die gleichen Daten zurück (die Antwort-Header von stackoverflow.com), mit Ausnahme von /api/test5
die niemals abgeschlossen wird.
Bin ich auf einen Fehler in der HttpClient-Klasse gestoßen, oder verwende ich die API auf irgendeine Weise falsch?
Code zum Reproduzieren:
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();
}
}