Sto premendo il deadlock anche dopo aver utilizzato ConfigureAwait(false)
, di seguito è riportato il codice di esempio.deadlock anche dopo l'utilizzo di ConfigureAwait (false) nel flusso Asp.Net
Come per il campione http://blog.stephencleary.com/2012/02/async-and-await.html (contesto #Avoding), questo non dovrebbe essere stato bloccato.
Questa è la mia classe:
public class ProjectsRetriever
{
public string GetProjects()
{
...
var projects = this.GetProjects(uri).Result;
...
...
}
private async Task<IEnumerable<Project>> GetProjects(Uri uri)
{
return await this.projectSystem.GetProjects(uri, Constants.UserName).ConfigureAwait(false);
}
}
Questa classe è da una libreria condivisa:
public class ProjectSystem
{
public async Task<IEnumerable<Project>> GetProjects(Uri uri, string userName)
{
var projectClient = this.GetHttpClient<ProjectHttpClient>(uri);
var projects = await projectClient.GetProjects();
// code here is never hit
...
}
Opere se aggiungo ConfigureAwait (false) in attesa di chiamata nella libreria condivisa , dove viene effettuata la chiamata HttpClient:
public class ProjectSystem
{
public async Task<IEnumerable<Project>> GetProjects(Uri uri, string userName)
{
var projectClient = this.GetHttpClient<ProjectHttpClient>(uri);
var projects = await projectClient.GetProjects().ConfigureAwait(false);
// no deadlock, resumes in a new thread.
...
}
Ho trovato tutti i blog trovati, solo la differenza che trovo è ConfigureAwait (false) funziona quando viene utilizzata con la chiamata httpClient.AsyncApi() !?
Si prega di aiutare a chiarire !!!
blocchi
Il tuo titolo dice * "non funziona nemmeno quando si utilizza' ConfigureAwait (false) 'ma nel tuo codice dici che il secondo esempio funziona. –
@Yuval Itzchakov: non funziona se usato in 'ProjectsRetriever' e funziona quando usato in' ProjectSystem' –
@ user2746890: 'Ero sotto ipotesi, quando viene usato ConfigureAwait (false) (qualsiasi dove nello stack di chiamate), esecuzione da quel punto non causerà deadlock. Non catturerà il contesto * per quell'attesa *. Ma interrompi le tue invocazioni e ti aspetti e scoprirai che 'ProjectSystem.GetProjects' è invocato (e attende) * prima * che tu chiami' ConfigureAwait (false) 'sull'attività restituita da' GetProjects'. IMO la risposta migliore è "fornire solo un'API asincrona", cioè rendere 'ProjectsRetriever.GetProjects()' async. –