关闭WebResponse,还是保持打开状态?

时间:2013-10-12 12:24:31

标签: c# sockets httpwebrequest webrequest webresponse

所以我正在制作一个几乎可以制作批量HttpWebRequests的程序。在这个程序中,速度是主要的。如果我能找到将HttpWebRequests增加甚至毫秒的方法,那就太棒了。

好的,我的问题是这样的:我有一个方法对一个站点发出HttpWebRequest(GET请求),另一个方法是对一个主机发出一个POST HttpWebRequest(略有不同的URL,但是同一个主机),这是每隔一段时间就叫第一种方法。

在我的第一个方法(GET请求,假设方法A)中,我在读取响应主体后关闭了WebResponse。让这个WebResponse保持打开状态,然后调用POST方法(让我们说方法B),或者我现在应该怎么做,从方法A关闭WebResponse是不是更快?

示例代码:

public string MethodA()
{
   // Make a HttpWebRequest to a URL like: xxxx.yyyy.com
   WebResponse response = request.GetResponse();
   string x = ReadResponseBody(response);
   response.Close();
   if(x.Contains("something"))
      MethodB();
}

public void MethodB()
{
   // Make a POST HttpWebRequest to a URL like: xxxx.zzzz.com (same host).
   WebResponse response = request.GetResponse();
   response.Close();
}

那么,我应该保留我的代码,关闭MethodA()中的第一个WebResponse,然后调用MethodB()或其他东西吗?

另外,任何人都可以提供一些关于如何提高速度的技巧,因为这是我程序中最重要的事情,我需要它尽可能快。

1 个答案:

答案 0 :(得分:10)

绝对关闭WebResponse - 理想情况下使用using语句:

using (WebResponse response = request.GetResponse())
{
    string x = ReadResponseBody(response);
}

如果您关闭响应,则框架不知道您已完成响应,并且不会重复使用该连接。如果您执行关闭响应,则会将连接返回到该主机的池中,并且可以重复使用。

由于每个主机有一个连接限制(可配置),因为您的进程等待Web响应最终确定,因此无法关闭响应可能会导致超时或死锁,然后表现得像关闭)。你真的不想等待垃圾收集器碰巧注意到你已经完成的响应:)