【问题标题】:Is an MVC Async controller that calls WebResponse still async?调用 WebResponse 的 MVC 异步控制器是否仍然异步?
【发布时间】:2012-05-31 02:12:22
【问题描述】:

我们有一个大型库,它使用 HttpWebRequest 进行大量 HTTP 调用以获取数据。重写这个库以使用 HTTPClient 的异步调用将是一种负担。所以,我想知道我是否可以创建使用 taskfactory 调用我们的库的异步控制器,以及最终通过 WebClient 进行的调用是异步的还是仍然是同步的。尝试将 async 与旧的 HttpWebRequest 混合使用是否会导致任何问题/副作用?

【问题讨论】:

  • WebClient 并不新鲜,至少从 .Net 1.1 开始就存在。你的意思是HtppClient,这是 .Net 4.5 和 ASP.NET MVC 4 中的新功能?
  • 是的,很抱歉造成混乱。你说得对,我的意思是新的 HttpClient。

标签: asp.net-mvc task-parallel-library


【解决方案1】:

如果我理解您的建议,答案是:不,将客户与之交谈的服务更改为异步将无济于事。当 I/O 与服务器未完成时,客户端仍会阻塞 CPU 线程,无论服务器是否异步。

没有理由放弃HttpWebRequest。您可以在 .NET 4.0 中使用 TaskFactory::FromAsync 来调用 HttpWebRequest::BeginGetResponse。看起来像这样:

WebRequest myWebRequest = WebRequest.Create("http://www.stackoverflow.com");

Task<WebResponse> getResponseTask = Task<WebResponse>.Factory.FromAsync(
                                                myWebRequest.BeginGetResponse,
                                                myWebRequest.EndGetResponse,
                                                null);

getResponseTask.ContinueWith(getResponseAntecedent =>
{
   WebResponse webResponse = getResponseAntecedent.Result;

   Stream webResponseStream = webResponse.GetResponseStream();

   // read from stream async too... eventually dispose of it
});

在 .NET 4.5 中,您仍然可以继续使用 HttpWebRequest 并使用新的 GetResponseAsync 方法和 C# 中的新 await 功能,让生活变得更轻松:

WebRequest myWebRequest = WebRequest.Create("http://www.stackoverflow.com");

using(WebResponse webResponse = await myWebRequest.GetResponseAsync())
using(Stream webResponseStream = webResponse.GetResponseStream())
{
     // read from stream async, etc.
}

【讨论】:

  • 啊,非常感谢。我认为调用仍然会阻塞,我从来没有想过 WebRequest 可能已经扩展为支持异步,但果然,浏览这些方法会告诉我你的答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多