Chỉnh sửa: Câu hỏi này có vẻ như có thể là cùng một vấn đề, nhưng không có câu trả lời ...
Chỉnh sửa: Trong trường hợp thử nghiệm 5, tác vụ dường như bị kẹt trong WaitingForActivation
trạng thái.
Tôi đã gặp một số hành vi kỳ quặc khi sử dụng System.Net.Http.HttpClient trong .NET 4.5 - trong đó "chờ" kết quả của một cuộc gọi đến (ví dụ) httpClient.GetAsync(...)
sẽ không bao giờ quay lại.
Điều này chỉ xảy ra trong một số trường hợp khi sử dụng chức năng ngôn ngữ async / await mới và API Nhiệm vụ - mã dường như luôn hoạt động khi chỉ sử dụng các phần tiếp theo.
Đây là một số mã tái tạo vấn đề - thả mã này vào một "dự án WebApi MVC 4" mới trong Visual Studio 11 để hiển thị các điểm cuối GET sau:
/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
Mỗi điểm cuối ở đây trả về cùng một dữ liệu (các tiêu đề phản hồi từ stackoverflow.com) ngoại trừ /api/test5
không bao giờ hoàn thành.
Tôi đã gặp phải một lỗi trong lớp HttpClient hay tôi đang lạm dụng API theo một cách nào đó?
Mã để sao chép:
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(...)
?