Tôi đang gặp bế tắc ngay cả sau khi sử dụng ConfigureAwait(false)
, bên dưới là mã mẫu.bế tắc ngay cả sau khi sử dụng ConfigureAwait (sai) trong dòng Asp.Net
Theo mẫu http://blog.stephencleary.com/2012/02/async-and-await.html (# Ngữ cảnh giải mã), điều này không nên có khóa chết.
Đây là lớp học của tôi:
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);
}
}
Lớp này là từ một thư viện chia sẻ:
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
...
}
trình nếu tôi thêm ConfigureAwait (false) để chờ đợi cuộc gọi trong thư viện chia sẻ , nơi cuộc gọi HttpClient được thực hiện:
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.
...
}
Tôi đã đi qua tất cả các blog được tìm thấy, chỉ có sự khác biệt mà tôi thấy là ConfigureAwait (false) hoạt động khi được sử dụng với httpClient.AsyncApi() gọi !?
Hãy giúp làm rõ!
Tiêu đề của bạn nói * "nó không hoạt động ngay cả khi sử dụng' ConfigureAwait (false) 'nhưng trong mã của bạn, bạn nói ví dụ thứ hai hoạt động. –
@Yuval Itzchakov: nó không hoạt động khi được sử dụng trong 'ProjectsRetriever' và hoạt động khi được sử dụng trong' ProjectSystem' –
@ user2746890: 'Tôi đã được giả định, một khi ConfigureAwait (false) được sử dụng (bất kỳ nơi nào trong ngăn xếp cuộc gọi), thực thi từ thời điểm đó sẽ không gây ra deadlock.' Nó sẽ không nắm bắt bối cảnh * cho rằng chờ đợi *. Nhưng phá vỡ các yêu cầu và chờ đợi của bạn, và bạn sẽ thấy rằng 'ProjectSystem.GetProjects' được gọi (và đang chờ) * trước * bạn gọi' ConfigureAwait (false) 'trên tác vụ được trả về bởi' GetProjects'. IMO câu trả lời hay nhất là "chỉ cung cấp một API không đồng bộ", tức là, làm cho 'ProjectsRetriever.GetProjects()' không đồng bộ. –