C# 如何高效地处理多线程HttpWebRequests?
我正在尝试多线程处理httpwebrequest。它不需要回复,我只需要尽快发送它们。目前我正在使用任务,但显然这不是最有效的方法,因为它使用您的系统规格来确定线程,而不是连接速度 所以我想我想问的是,基于连接速度而不是你的电脑的内核数量,使用线程最有效的方法是什么C# 如何高效地处理多线程HttpWebRequests?,c#,.net,multithreading,httpwebrequest,C#,.net,Multithreading,Httpwebrequest,我正在尝试多线程处理httpwebrequest。它不需要回复,我只需要尽快发送它们。目前我正在使用任务,但显然这不是最有效的方法,因为它使用您的系统规格来确定线程,而不是连接速度 所以我想我想问的是,基于连接速度而不是你的电脑的内核数量,使用线程最有效的方法是什么 谢谢您可以使用BeginGetResponse()方法,这是WebRequest的async方法您可以使用BeginGetResponse()方法,这是WebRequest的async方法,我建议您建立一个工作队列,并在字典中跟踪正
谢谢您可以使用
BeginGetResponse()
方法,这是WebRequest
的async
方法您可以使用BeginGetResponse()
方法,这是WebRequest
的async
方法,我建议您建立一个工作队列,并在字典中跟踪正在运行的工作人员,在运行的工作人员完成时启动新的工作人员。这使您可以调整活动工作人员的数量。它还为您提供了一个活动工作人员的集合,以防您需要向他们发送停止消息
您需要将其添加到app.config中,以超过默认连接限制2:
<system.net>
<connectionManagement>
<remove address="*"/>
<add address="*" maxconnection="10" />
</connectionManagement>
</system.net>
我建议您建立一个工作人员队列,并在字典中跟踪正在运行的工作人员,在运行的工作人员完成时启动新的工作人员。这使您可以调整活动工作人员的数量。它还为您提供了一个活动工作人员的集合,以防您需要向他们发送停止消息 您需要将其添加到app.config中,以超过默认连接限制2:
<system.net>
<connectionManagement>
<remove address="*"/>
<add address="*" maxconnection="10" />
</connectionManagement>
</system.net>
或者简单地使用Parallel.For/ForEach它将为您执行线程优化(选择池大小、线程数等:)或者简单地使用Parallel.For/ForEach它将为您执行线程优化(选择池大小、线程数等:)默认情况下,允许.Net应用程序打开到web服务器的2个连接。您可以通过设置此变量来增加该数字
//Set the connection limit of HTTP
System.Net.ServicePointManager.DefaultConnectionLimit = 20;
无论是使用常规调用还是异步方法,使用HttpWebRequest/HttpWebResponse,都必须正确地处理/关闭getreponstream()中的流。通过关闭GetResponseStream()中的流,应用程序将在完成HTTP连接后终止HTTP连接
例如,在下面的代码中,我从web返回StreamReader
public static StreamReader LoadWeb(string URL)
{
if (!URL.StartsWith("http"))
{
URL = "http://" + URL;
}
HttpWebResponse myResponse = null;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(new Uri(URL));
System.IO.Stream myStream = null;
StreamReader myStreamReader = null;
myRequest.Method = "GET";
myRequest.Proxy = null;
myRequest.Timeout = 60000;
myRequest.KeepAlive = false;
try
{
myResponse = (HttpWebResponse)myRequest.GetResponse();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("Error : " + ex.Message);
return null;
}
if (myResponse != null)
{
if (myResponse.StatusCode == System.Net.HttpStatusCode.OK)
{
myStream = myResponse.GetResponseStream();
myStreamReader = new StreamReader(myStream);
}
}
return myStreamReader;
}
之后,我从LoadWeb函数得到了返回值
StreamReader reader = LoadWeb("http://www.google.com");
//...process the reader
//Finally, close the reader
if (reader != null)
reader.Close(); //This line will terminate the HTTP connection
希望有帮助。默认情况下,.Net应用程序允许打开与web服务器的2个连接。您可以通过设置此变量来增加该数字
//Set the connection limit of HTTP
System.Net.ServicePointManager.DefaultConnectionLimit = 20;
无论是使用常规调用还是异步方法,使用HttpWebRequest/HttpWebResponse,都必须正确地处理/关闭getreponstream()中的流。通过关闭GetResponseStream()中的流,应用程序将在完成HTTP连接后终止HTTP连接
例如,在下面的代码中,我从web返回StreamReader
public static StreamReader LoadWeb(string URL)
{
if (!URL.StartsWith("http"))
{
URL = "http://" + URL;
}
HttpWebResponse myResponse = null;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(new Uri(URL));
System.IO.Stream myStream = null;
StreamReader myStreamReader = null;
myRequest.Method = "GET";
myRequest.Proxy = null;
myRequest.Timeout = 60000;
myRequest.KeepAlive = false;
try
{
myResponse = (HttpWebResponse)myRequest.GetResponse();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show("Error : " + ex.Message);
return null;
}
if (myResponse != null)
{
if (myResponse.StatusCode == System.Net.HttpStatusCode.OK)
{
myStream = myResponse.GetResponseStream();
myStreamReader = new StreamReader(myStream);
}
}
return myStreamReader;
}
之后,我从LoadWeb函数得到了返回值
StreamReader reader = LoadWeb("http://www.google.com");
//...process the reader
//Finally, close the reader
if (reader != null)
reader.Close(); //This line will terminate the HTTP connection
希望有帮助。Second@Asif的答案是,异步I/O可能比在您的案例中创建更多线程更高效。Second@Asif的答案是,异步I/O可能比在您的案例中创建更多线程更高效。函数是静态的。它可以在多线程环境中使用。更好的选择是在更高的.Net版本上使用Task.Run()或异步HttpWebRequest。这还不够。只有两个谁认为那个愚蠢的极限上升了?无论如何,非常感谢,非常有用。函数是静态的。它可以在多线程环境中使用。更好的选择是在更高的.Net版本上使用Task.Run()或异步HttpWebRequest。这还不够。只有两个谁认为那个愚蠢的极限上升了?无论如何,非常感谢你,非常有帮助。