关闭HttpWebRequest以释放资源

时间:2015-04-15 14:03:46

标签: c# stream httpwebrequest

我在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();

我知道我必须关闭响应,流和streamreader才能释放资源。 我是否必须在每个请求之间或在所有内容结束时执行此操作?

2 个答案:

答案 0 :(得分:3)

是的,你每次都需要自己清理。只需使用您忽略的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块结束时)。

答案 1 :(得分:1)

Alltough @spender有一个观点,他说你应该使用using指令,我不认为他的回答能回答你的问题,或者特别有帮助。

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

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

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

因此,如果您想重用变量,请务必使用Close