Modifica: questa domanda sembra che potrebbe essere lo stesso problema, ma non ha risposte ...
Modifica: nel caso di test 5 l'attività sembra bloccata nello WaitingForActivation
stato.
Ho riscontrato alcuni comportamenti strani utilizzando System.Net.Http.HttpClient in .NET 4.5 - in cui "in attesa" il risultato di una chiamata (ad es.) httpClient.GetAsync(...)
Non tornerà mai più.
Ciò si verifica solo in determinate circostanze quando si utilizza la nuova funzionalità di linguaggio asincrono / wait e l'API Task: il codice sembra funzionare sempre quando si utilizzano solo continuazioni.
Ecco un po 'di codice che riproduce il problema: trascinalo in un nuovo "progetto MVC 4 WebApi" in Visual Studio 11 per esporre i seguenti endpoint GET:
/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
Ciascuno degli endpoint qui restituisce gli stessi dati (le intestazioni di risposta da stackoverflow.com) ad eccezione del /api/test5
quale non viene mai completato.
Ho riscontrato un bug nella classe HttpClient o utilizzo in qualche modo l'API?
Codice da riprodurre:
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(...)
?