【问题标题】:How to return result from Task<HttpResponseMessage>, to take the benefit of Async HttpClient call?如何从 Task<HttpResponseMessage> 返回结果,以利用 Async HttpClient 调用?
【发布时间】:2013-04-10 18:15:19
【问题描述】:

我可以像下面这样写代码(第一个)

public Task<HttpResponseMessage> Get(int id)
{
 return Task<HttpResponseMessage>.Factory.StartNew(() =>
  Request.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(model)));

}

我可以像下面这样写代码(第二个)

public Task<HttpResponseMessage> Put(int id, string value)
{
   return Task<HttpResponseMessage>.Factory.StartNew(() =>
     Request.CreateResponse(HttpStatusCode.OK));

}

我想使用Httpclient.PutAsJsonAsync() 调用上述Put 方法。在.Net 4.0 中?

或者有更好的方法吗?所以我可以利用异步调用的好处吗?

【问题讨论】:

标签: c#-4.0 asp.net-web-api task-parallel-library dotnet-httpclient


【解决方案1】:

如果您的代码中没有任何操作是异步的(或阻塞的),那么进行异步操作是没有意义的。在你的两个例子中,操作只是返回一个响应,所以你不需要使用Task&lt;HttpResponseMessage&gt;响应,使用HttpResponseMessage就可以了。

所以,更直接地回答您的问题,是的,您可以编写这样的代码,但它比必要的更复杂,会导致不必要的上下文切换(以创建新任务),并且整体性能较低。你可以这样做,但你不应该这样做。

【讨论】:

  • 所以你的意思是,如果我使用任何带有 Web Api 的 HttpClient 调用,那么只有我使用 Task&lt;HttpResponseMessage&gt; 作为返回类型?
  • 如果您想在 Web API 中进行异步调用,您应该 1) 不要阻塞该调用(例如,通过调用 .Result)和 2) 通过标记来声明您的操作本身是异步的它的返回类型为Task&lt;T&gt;。
  • 感谢您的澄清。
  • 如果在 Web API 中我必须根据条件返回一个简单响应 (HttpStatusCode) 和 Httpclient.PutAsJsonAsync() 调用,那么应该使用什么返回类型 Task&lt;T&gt; 或普通 HttpResponse
猜你喜欢
  • 2012-12-13
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多