我们有一个大型库,它使用HttpWebRequest进行大量HTTP调用来获取数据。重写此库以使用与HTTPClient的异步调用将是一个熊。所以,我想知道我是否可以创建使用taskfactory调用我们的库的异步控制器,以及最终通过WebClient进行的调用是异步还是仍然是同步的。尝试将异步与旧的HttpWebRequest混合,是否会出现任何问题/副作用?
答案 0 :(得分:6)
如果我理解你提出的建议答案是:不,改变客户谈到的服务是异步的也无济于事。无论服务器是否异步,客户端仍会在服务器的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.
}