【发布时间】:2015-07-27 16:40:43
【问题描述】:
我有一个 webApi 操作,它在 || 中执行 2 个操作它在内部调用 HttpClient sendAsync。如果我应用调试器并执行调用,它会工作并返回。如果我删除调试器,两个异步调用仍然有效(在 Fiddler 中检查)但 WebApi 操作的调用者没有得到任何响应(使用 AdvanceRest chrome 插件)。从其他线程来看,可能我没有正确使用 async/await 并且与 ASP.NET 同步上下文相关
//**WEB API Controller***
class SomeController
{
public HttpResponseMessage Get()
{
Client someClient = new Client();
aResponse = new aResponse();
bResponse = new bResponse();
Parallel.Invoke(
() => {aResponse = someClient.a()},
() => {bResponse = someClient.b()});
var response = {a=aResponse, b=bResponse};
return Response.Create(OK, response}
}
class SomeClient
{
AResponse a()
{
var clientResponse = ClientMgr.Execute("url");
return new AResponse {HttpClientResponse = clientResponse.Result}
}
BResponse b()
{
var clientResponse = ClientMgr.Execute("url");
return new BResponse {HttpClientResponse = clientResponse.Result}
}
}
//Utility CLASS
public class ClientMgr
{
public static async Task<HttpResponseMessage> Execute(string url)
{
request = new HttpRequestMessage();
//....request fill
HttpClient client = new HttpClient();
var response = await client.SendAsync(request);
client.dispose();
return response;
}
}
public class AResponse
{
HttpResponseMessage HttpClientResponse {get;set;}
// Some other properties....
}
为什么在我使用断点时操作会返回响应,但当我删除它们时,它不会返回响应?
【问题讨论】:
-
什么是
Execute?您的客户管理器中只有一个ExecuteFeed方法。 -
对不起..是一个错字...它只执行。
-
您不会在任何地方
awaiting 执行 Execute 的响应。Invoke将开始异步操作并立即完成。无论如何,您可以使用var results=await Task.WhenAll(someClient.a(),someClient.b(),...);而不是Parallel.Invoke。顺便说一句,代码不会编译。Execute返回一个任务,而a返回一个HttpResponseMessage。我假设a()实际上也返回了Task<HttpResponseMessage> -
a() 和 b() 返回带有一些属性/数据的自定义响应,这些属性/数据是 ExecuteFeed 结果的一部分。
-
那为什么
a()和b()返回HttpResponseMessage?请将您的代码示例修复为实际工作示例。
标签: c# async-await