如果我在A页中生成HttpWebRequest GetResponse(),当我加载其他页面时,它会冻结,直到页面A被完全加载。
代码:
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = method;
request.Accept = "text/javascript, text/html, application/xml, text/xml, */*";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Host = "steamcommunity.com";
request.UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11";
// Get the response
return request.GetResponse() as HttpWebResponse;
如何在不冻结其他页面的情况下使其异步?
发布于 2013-12-29 09:40:12
简单介绍一下:
HTTP协议是请求/响应协议。这意味着客户端发送请求,服务器执行一些处理并返回响应。
如果在处理请求的过程中,服务器需要向远程资源发出另一个请求,并将此请求的结果用于响应,则只能等待。
这就是说,您可以通过利用asynchronous pages
和I/O完成端口来优化它。这基本上允许在执行远程HTTP请求期间释放工作线程。
不要被愚弄到认为这会使反应更快。如果远程服务器运行缓慢,它将不会危及您的工作线程。这意味着您的应用程序将能够处理其他请求。
为了实现这一点,您可以使用HttpWebRequest的HttpWebRequest方法。它们允许利用I/O完成端口进行异步执行。
在前面链接的文章中,您将发现如何使您的ASP.NET页面(或者如果您使用处理程序)是异步的。
第一步是标记WebForm异步:
<%@ Page Async="true" ... %>
然后可以使用AddOnPreRenderCompleteAsync
方法注册异步任务:
using System;
using System.IO;
using System.Net;
using System.Web;
public partial class WebForm1 : System.Web.UI.Page
{
private HttpWebRequest request;
protected void Page_Load(object sender, EventArgs e)
{
this.AddOnPreRenderCompleteAsync(
new BeginEventHandler(this.BeginAsyncOperation),
new EndEventHandler(this.EndAsyncOperation)
);
}
private IAsyncResult BeginAsyncOperation(object sender, EventArgs e, AsyncCallback cb, object state)
{
string url = "http://example.com";
string method = "GET";
this.request = (HttpWebRequest)WebRequest.Create(url);
this.request.Method = method;
this.request.Accept = "text/javascript, text/html, application/xml, text/xml, */*";
this.request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
this.request.Host = "steamcommunity.com";
this.request.UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11";
return this.request.BeginGetResponse(cb, state);
}
private void EndAsyncOperation(IAsyncResult ar)
{
using (WebResponse response = this.request.EndGetResponse(ar))
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
// TODO: do something with the result here => like binding
// it to some Web Control or displaying it somewhere on the page
}
}
}
作为这种方法的另一种选择,您可以考虑更快地加载页面,然后触发一个AJAX请求到另一个处理程序,该处理程序将执行远程请求并返回结果。在这种情况下,初始请求页将加载得更快,而不是冻结,但是结果会在远程请求完成处理后出现。
但是,在这两种情况下,我都建议您利用异步页面来避免阻塞工作线程,这可能会对应用程序造成灾难性的后果,特别是由于某些原因,您正在访问的远程服务器非常缓慢。
https://stackoverflow.com/questions/20823810
复制相似问题