mam trafienia impasu nawet po użyciu ConfigureAwait(false)
poniżej przykładowy kod.impasu nawet po użyciu ConfigureAwait (fałsz) w ASP.NET przepływu
Jak na próbki http://blog.stephencleary.com/2012/02/async-and-await.html (#Avoding kontekstu), nie powinno to być hit martwego blokadę.
To moja klasa:
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);
}
}
Ta klasa jest z udostępnionej biblioteki:
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
...
}
Works jeśli dodam ConfigureAwait (fałsz) w oczekiwaniu na połączenie w udostępnionej biblioteki , gdzie wezwanie HttpClient jest wykonany:
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.
...
}
Przyjeżdżam na wszystkich blogach znaleziony, jedyną różnicą jest ConfigureAwait znajdę (fałsz) działa w przypadku korzystania z httpClient.AsyncApi() zadzwonić !?
Proszę pomóc wyjaśnić !!!
Twój tytuł mówi * "to nie działa nawet przy użyciu' ConfigureAwait (false) ', ale w kodzie mówisz drugi przykład działa. Który to? –
@Yuval Itzchakov: nie działa, gdy jest używany w 'ProjectsRetriever' i działa, gdy jest używany w' ProjectSystem' –
@ user2746890: 'Byłem pod założeniem, po użyciu ConfigureAwait (false) (gdziekolwiek w stosie wywołań), wykonanie od tego momentu nie spowoduje impasu. "Nie uchwyci kontekstu *, który czeka *. Ale włóż się do inwokacji i oczekuj, a zobaczysz, że 'ProjectSystem.GetProjects' jest wywoływany (i czeka) * przed * wywołujesz' ConfigureAwait (false) 'na zadaniu zwróconym przez' GetProjects'. IMO najlepszą odpowiedzią jest "dostarczanie tylko asynchronicznego API", tj. Tworzenie asynchronizmu 'ProjectsRetriever.GetProjects()'. –