编辑: 这个问题看起来可能是同一个问题,但没有回复......
编辑:在测试用例5中,任务似乎陷入WaitingForActivation状态.
我在.NET 4.5中使用System.Net.Http.HttpClient遇到了一些奇怪的行为 - 其中"等待"调用(例如)的结果httpClient.GetAsync(...)将永远不会返回.
只有在使用新的async/await语言功能和Tasks API时才会出现这种情况 - 在仅使用continuation时,代码似乎始终有效.
下面是一些重现问题的代码 - 将其放入Visual Studio 11中新的"MVC 4 WebApi项目"中,以显示以下GET端点:
/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- never completes
/api/test6
Run Code Online (Sandbox Code Playgroud)
这里的每个端点都返回相同的数据(来自stackoverflow.com的响应头),除非/api/test5从未完成.
代码重现:
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
/// …Run Code Online (Sandbox Code Playgroud) 我想在我的程序中实现的是以下callstack/workflow:
我的想法是,这dispatch()将是异步的,而其他两种方法仍然是非同步的.但是,出于某种原因,除非我做了2 + 3,否则它对我不起作用.异步.也许我还有一些误解.
根据我的理解,我可以a)authorize()在调用异步方法时使用-keyword(这将挂起方法并在异步方法完成后继续),或者b)省略httpPost()-keyword而是调用异步方法的Task.Result返回值,将阻塞直到结果可用.
让我告诉你工作的例子:
private int dispatch(string options)
{
int res = authorize(options).Result;
return res;
}
static async private Task<int> authorize(string options)
{
string values = getValuesFromOptions(options);
KeyValuePair<int, string> response = await httpPost(url, values);
return 0;
}
public static async Task<KeyValuePair<int, string>> httpPost(string url, List<KeyValuePair<string, string>> parameters)
{
var httpClient = new HttpClient(new HttpClientHandler());
HttpResponseMessage response = await httpClient.PostAsync(url, new FormUrlEncodedContent(parameters));
int code = (int)response.StatusCode;
response.EnsureSuccessStatusCode();
string responseString = …Run Code Online (Sandbox Code Playgroud)