13
WebResponse response;
try
{                
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 request.Timeout = 20000;
 response = request.GetResponse();

 request = (HttpWebRequest)WebRequest.Create(url2);
 response = request.GetResponse();
}
catch(Exception ex)
{
 //do something
}              
finally
{
}

response.Close() をどこで呼び出す必要がありますか?

  • GetResponse() を試すたびに?

  • 試行中の最後の GetResponse() の後 - 一度?

  • 最終ブロックで?
4

4 に答える 4

22

上記のどれでもない。usingブロックを使用する必要があります:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
{
    using (var stream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            var result = reader.ReadToEnd();
            // Do something with result
        }
    }
}

usingブロックは、例外があるかどうかにかかわらず、Dispose メソッドが呼び出されることを保証します。Dispose は Close と同じことを行います。

using (var d = new DisposableClass()){code;}

次と同等です。

DisposableClass d = null;
try
{
    d = new DisposableClass();
    code;
}
finally
{
    if (d != null)
        ((IDisposable)d).Dispose();
}
于 2009-07-26T12:27:03.253 に答える
1

finally ブロックに入れます。MSDNによると:

finally ブロックは、try ブロックで割り当てられたリソースをクリーンアップしたり、例外が発生した場合でも実行する必要があるコードを実行したりするのに役立ちます。try ブロックの終了方法に関係なく、制御は常に finally ブロックに渡されます。

于 2009-07-26T12:24:52.177 に答える
0

ネストされた使用ブロックは中括弧を必要としないため、読みやすさが向上することに注意してください。したがって、JohnSaunderのコードは次のように記述できます。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    var result = reader.ReadToEnd();
    // Do something with result
}

VS.NETは、そのようなネストされたブロックはインデントを必要としないことを理解しています。ところで、応答のエンコーディングを知っているか、それを無視しようとしている場合、WebClientはより単純なAPIを提供します-ヘッダー情報が欠落しているため、ヘッダーベース(転送/テキスト)のエンコーディング検出は不可能になりますが、それ以外の場合は正常に機能します。

于 2009-07-26T13:34:33.333 に答える
-1

私は以下を提案します

        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
            request.Timeout = 20000;
            using (var response = request.GetResponse())
            {
                //Do something with response.
            }


            request = (HttpWebRequest)WebRequest.Create("http://www.bing.com");
            using (var response = request.GetResponse())
            {
                //Do somehing with response
            }
        }
        catch (Exception ex)
        {
            //do something
        }
        finally
        {
        }
于 2009-07-26T12:26:46.263 に答える