关闭 HttpWebRequest 以释放资源

Close HttpWebRequest to free up resources

我正在用 C# 创建 HTTP WebRequests 来浏览网站。我创建请求,获得响应并将其读入 StreamReader。然后我使用相同的请求变量创建一个新请求并获得一个新响应...

下面是我的代码:

HttpWebRequest request;
WebResponse response;
Stream responseStream;
StreamReader reader;
string responseFromServer;

request = (HttpWebRequest)WebRequest.Create("https://www.firstRequest.com");

//set cookies and headers here... 

response = request.GetResponse();

responseStream = response.GetResponseStream();
reader = new StreamReader(responseStream);
responseFromServer = reader.ReadToEnd();


//second request using the same variables
request = (HttpWebRequest)WebRequest.Create("https://www.secondRequest.com");
response = request.GetResponse();

responseStream = response.GetResponseStream();
reader = new StreamReader(responseStream);
responseFromServer = reader.ReadToEnd();

我知道我必须关闭响应、流和流读取器以释放资源。 我是否必须在每个请求之间或仅在所有请求结束时执行此操作?

是的,你每次都需要清理自己。只需使用您忽略的 IDisposable 功能:

因此,您可以

using(response = request.GetResponse())
{
    using(responseStream = response.GetResponseStream())
    {
        using(reader = new StreamReader(responseStream))
        {
            responseFromServer = reader.ReadToEnd();
        }
    }
}

或更简洁:

using(response = request.GetResponse())
using(responseStream = response.GetResponseStream())
using(reader = new StreamReader(responseStream))
{
    responseFromServer = reader.ReadToEnd();
}

...现在您无需担心调用 Close。 IDisposable 实现会为您处理(当 using 块结束时)。

Alltough @spender 在他说你应该使用 using 指令时说得有道理,我认为他的回答没有回答你的问题或特别有帮助。

考虑此类问题时,请考虑 C# 的基础知识和实现 IDisposable 的对象。 类 这样做会利用在 class 不再使用时需要释放的非托管资源。这发生在 using 块的末尾或调用 Dispose 时。

但是,在调用 Dispose 之后,不应再使用该对象。这是与 Close 的根本区别。使用 Close 响应释放资源,同一对象可以被另一个请求重用。 MSDN for Close

现在让我们考虑一下如果您简单地覆盖响应变量会发生什么。 classes 是 C# 中的引用类型,变量现在将引用一个新对象,而旧的响应对象将在涅盘中消失,等待最终由 GC 收集而不调用 Dispose。当然不是你想要的。

所以如果你想重用变量,确保你使用Close