C# 如何高效地处理多线程HttpWebRequests?

C# 如何高效地处理多线程HttpWebRequests?,c#,.net,multithreading,httpwebrequest,C#,.net,Multithreading,Httpwebrequest,我正在尝试多线程处理httpwebrequest。它不需要回复,我只需要尽快发送它们。目前我正在使用任务,但显然这不是最有效的方法,因为它使用您的系统规格来确定线程,而不是连接速度 所以我想我想问的是,基于连接速度而不是你的电脑的内核数量,使用线程最有效的方法是什么 谢谢您可以使用BeginGetResponse()方法,这是WebRequest的async方法您可以使用BeginGetResponse()方法,这是WebRequest的async方法,我建议您建立一个工作队列,并在字典中跟踪正

我正在尝试多线程处理httpwebrequest。它不需要回复,我只需要尽快发送它们。目前我正在使用任务,但显然这不是最有效的方法,因为它使用您的系统规格来确定线程,而不是连接速度

所以我想我想问的是,基于连接速度而不是你的电脑的内核数量,使用线程最有效的方法是什么


谢谢

您可以使用
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。这还不够。只有两个谁认为那个愚蠢的极限上升了?无论如何,非常感谢你,非常有帮助。