关闭 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
我正在用 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