2009-07-26 8 views
12

zaman WebResponse.Close çağırmak için()

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() çağrılmalıdır? denemede her GetResponse() sonra
  • ?

  • son GetResponse() öğesinden sonra - bir kez? Son olarak blokta

  • ?

cevap

19

Hiçbiri öneririm. Bir using blok kullanarak edilmelidir:

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 
     } 
    } 
} 

A using blok bir istisna olup olmadığı ya da olmasın, imha yöntemi denir sağlayacaktır. Al, aynı şeyi Kapat olarak yapacağız. okunabilirliği artırmak, küme parantezi gerekmez bloklarını kullanarak iç içe

DisposableClass d = null; 
try 
{ 
    d = new DisposableClass(); 
    code; 
} 
finally 
{ 
    if (d != null) 
     ((IDisposable)d).Dispose(); 
} 
+1

Daha detaylı bir açıklama için, tüm bu ifadeleri kullanarak nasıl/nihayet ifadelerine dönüştürüldüğünü gösterebilirsiniz :) Bunu söylemem gerekçesi, sonunda bir açıklamada bulunup koymayacağının sorulmasıdır. ... Açıkça daha temiz/daha okunaklı bir şekilde. –

+0

Şüphesiz bu, 'kullanma' kullanmadan yapılabilmelidir, sadece standart deneme yakalama sonunda bloklar? – UpTheCreek

+0

WebResponse örneğini atmak zorunlu mudur? Vs2008'in intelliense'de imha etmiyorum. –

1

Sonuncu bloğa koyun. MSDN gereğince: yılında try bloğu tahsis herhangi kaynakları Temizleme yanı sıra bir istisna var bile yürütmek zorundadır herhangi kod çalıştırmak için

nihayet blok yararlıdır. Kontrol her zaman nolu bloğa, try bloğunun çıkışından bağımsız olarak 'a bakmaksızın geçirilir.

+0

Ama eğer o yanıt verir.Close() sonunda bir "unasigned değişken kullanımı" hatası alırsınız. – UpTheCreek

-1

Yukarıda aşağıda

 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 
     { 
     } 
+1

Şüphesiz ilk "istek" örneğini elden çıkarmanız/Kapatmanız gerekir, çünkü bu örneği yeni bir kodun üzerine yazdığınızdan, Çöp toplayıcısının merhametinde olduğunuzda, ilk elden çıkarıldığında. – Marineio

+2

WebRequest IDisposable uygulamıyor. –

+0

Burada 'nihayet' bloğu için bir sebep yok. Ayrıca, 'catch'da bazı gerçek kodlar olmadan, bu cevap tüm kodun etrafında' try/catch 'yapılması gerektiği yanlış izlenim bırakabilir. –

0

Not:

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

eşdeğerdir. Yani John Saunder kod yazılabilir:

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 böyle iç içe bloklar girinti gerekmez anlar. Yanıtın kodlamasını bildiğiniz veya herhangi bir şekilde göz ardı edeceğinizi düşünüyorsanız, WebClient'in daha basit bir API - eksik başlık bilgisi sağladığını, böylece Başlık tabanlı (aktarım/metin) kodlama algılamasının imkansız olduğunu, aksi takdirde iyi çalıştığını unutmayın.

+0

Bunun okunabilirliği azalttığını iddia ediyorum. "If (basit koşul) geri dönüş" gibi nadir durumlar dışında, hemen hemen her zaman, tek satırlık bile olsa, parantez eklerim. –

+1

Kısa kodlar için belki - gerçek dosyalar için bu gereksiz parantezleri gereksiz satırlara eklediğinizde, kodunuzun bir ekrana daha uzun ve daha az sığdığı anlamına gelir, yani daha az genel bakışınız olur. Gerçek ipucu, bir şekilde girinti olmalı ve VS.NET, bu kodu kafa karıştırıcı olmayan bir şekilde otomatik olarak girer. –