편집 : 이 질문 은 같은 문제 일 것 같지만 응답이 없습니다 ...
편집 : 테스트 사례 5에서 작업이 정지 된 것처럼 보입니다 WaitingForActivation
.
.NET 4.5에서 System.Net.Http.HttpClient를 사용하여 이상한 동작이 발생했습니다. 여기서 (예를 들어) 호출의 결과를 "대기"하면 httpClient.GetAsync(...)
반환되지 않습니다.
이는 새로운 비동기 / 대기 언어 기능 및 작업 API를 사용할 때 특정 상황에서만 발생합니다. 코드는 계속 사용하는 경우 항상 작동하는 것 같습니다.
다음은 문제를 재현하는 코드입니다. Visual Studio 11의 새로운 "MVC 4 WebApi 프로젝트"에 다음 GET 엔드 포인트를 표시하십시오.
/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
여기서 각 끝점 /api/test5
은 완료되지 않은 것을 제외하고는 동일한 데이터 (stackoverflow.com의 응답 헤더)를 반환합니다 .
HttpClient 클래스에서 버그가 발생 했습니까, 아니면 어떤 식 으로든 API를 잘못 사용하고 있습니까?
재현 할 코드 :
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(...)
합니까?