1

以下のコードでメモリ不足の例外が発生する原因は何ですか? 私のプログラムは数時間実行され、その後終了しました。コードは毎回非常に少量のデータを送受信するだけなので、巨大なファイルや文字列がネットワーク上を移動したり戻ってきたりすることはありません。このコードは、約 3 秒ごとにサーバーから送受信します。

private void Read()
{
    string postData = "Name=John"
    using (HttpWebResponse response = SendRequest(new Uri(@"someWebSitehere"), postData))
    {
         Stream stream = response.GetResponseStream();
         StreamReader reader = new StreamReader(stream);
         responseFromServer = reader.ReadToEnd();  IT THROWS OUT OF MEMORY HERE
         stream.Close();
    }
}

private HttpWebResponse SendRequest(Uri uri, string postData)
{
    lock (SendRequestLock)
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);

        req.Method = "POST";
        req.CookieContainer = new CookieContainer();
        req.Proxy = null;
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] byte1 = encoding.GetBytes(postData);

        // Set the content type of the data being posted.
        req.ContentType = "application/x-www-form-urlencoded";

        // Set the content length of the string being posted.
        req.ContentLength = byte1.Length;

        req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";
        req.Method = "POST";
        req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        req.Headers.Add("Accept-Language: en-us,en;q=0.5");
        req.Headers.Add("Accept-Encoding: gzip,deflate");
        req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
        req.KeepAlive = true;
        req.Headers.Add("Keep-Alive: 300");
        using (Stream stream = req.GetRequestStream())
        {
            stream.Write(byte1, 0, byte1.Length);
        }
        return (HttpWebResponse)req.GetResponse();
    }
}
4

2 に答える 2

2

IDisposable クラスStreamStreamReader次のものを破棄する必要があります。

using (Stream stream = response.GetResponseStream())
{
    using (StreamReader reader = new StreamReader(stream)) 
    {
        responseFromServer = reader.ReadToEnd();  //IT THROWS OUT OF MEMORY HERE
    }
}

一般に、実装するクラスには、呼び出さない限り(または、同じように、ブロック内にIDisposable配置しない限り) ハングアップする外部リソースがあります。コードのブロックが実行されるたびに、これらのクラスがメモリをリークしている可能性が高いため、しばらくすると「メモリ不足」の例外が発生します。Dispose()using

IDisposable に関する MSDN のメモを読む価値があります。

于 2012-10-20T18:04:35.310 に答える
1

応答の Content-Length を確認しましたか。多分それは非常に巨大です。この場合、応答ストリームを部分的に読み取る必要があります

于 2012-10-20T18:21:21.137 に答える