【问题标题】:Close WebResponse, or Leave Open?关闭 WebResponse,还是保持打开状态?
【发布时间】:2013-10-12 12:24:31
【问题描述】:

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

好的,所以我的问题是:我有一个向站点发出 HttpWebRequest(GET 请求)的方法,以及另一个向同一主机(URL 略有不同,但主机相同)发出 POST HttpWebRequest 的方法,即每隔一段时间在第一个方法之后调用一次。

在我的第一个方法(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(),还是其他?

另外,谁能提供更多关于如何提高速度的提示,因为这是我的程序中最重要的事情,我需要它尽可能快。

【问题讨论】:

  • 每个问题只问一个问题。

标签: c# sockets httpwebrequest webrequest webresponse


【解决方案1】:

您应该绝对关闭WebResponse - 最好使用using 语句:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2018-07-09
    • 2013-10-21
    • 2011-06-19
    • 2011-09-14
    相关资源
    最近更新 更多