Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
UsingUsing örneği, yazılan istemci kullanılırken kaynakları temizlemek için ve Abort
yöntemlerinin kullanılmasını gösterirClose
. Deyimi, using
ağ bağlantısı sağlam olmadığında özel durumlara neden olur. Bu örnek, hesap makinesi hizmeti uygulayan Başlarken'i temel alır. Bu örnekte istemci bir konsol uygulamasıdır (.exe) ve hizmet Internet Information Services (IIS) tarafından barındırılır.
Not
Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.
Bu örnek, türü yazılan istemcilerle C# "using" deyimini kullanırken oluşan yaygın sorunlardan ikisini ve özel durumlardan sonra doğru şekilde temizleyen kodu gösterir.
C# "using" deyimi () çağrısıyla Dispose
sonuçlanıyor. Bu, ağ hatası oluştuğunda özel durumlar oluşturabilen () ile aynıdır Close
. çağrısı Dispose
() "using" bloğunun kapanış ayracında örtük olarak gerçekleştiğinden, bu özel durum kaynağının hem kodu yazan hem de kodu okuyan kişiler tarafından algılanmaması olasıdır. Bu, uygulama hatalarının olası bir kaynağını temsil eder.
yönteminde DemonstrateProblemUsingCanThrow
gösterilen ilk sorun, kapanış ayracının bir özel durum oluşturması ve kapanış ayracı yürütülmedikten sonra kodun yürütülmemesidir:
using (CalculatorClient client = new CalculatorClient())
{
...
} // <-- this line might throw
Console.WriteLine("Hope this code wasn't important, because it might not happen.");
Using bloğunda hiçbir şey özel durum oluşturmasa veya using bloğunun içindeki tüm özel durumlar yakalansa bile, Console.WriteLine
kapatma küme ayracındaki örtük Dispose
() çağrısı bir özel durum oluşturabileceğinden bu gerçekleşmeyebilir.
yönteminde DemonstrateProblemUsingCanThrowAndMask
gösterilen ikinci sorun, özel durum oluşturan kapanış ayracının başka bir etkisidir:
using (CalculatorClient client = new CalculatorClient())
{
...
throw new ApplicationException("Hope this exception was not important, because "+
"it might be masked by the Close exception.");
} // <-- this line might throw an exception.
Dispose
() bir "finally" bloğunun içinde oluştuğundan , ApplicationException
() başarısız olursa hiçbir zaman using bloğunun Dispose
dışında görülmez. Dışındaki kodun ne zaman gerçekleştiğini ApplicationException
bilmesi gerekiyorsa, "using" yapısı bu özel durumu maskeleyerek sorunlara neden olabilir.
Son olarak, örnekte özel durumlar oluştuğunda doğru temizleme işlemi gösterilmektedir DemonstrateCleanupWithExceptions
. Bu, hataları bildirmek ve çağrısı Abort
yapmak için try/catch bloğu kullanır. İstemci çağrılarından özel durumları yakalama hakkında daha fazla bilgi için Beklenen Özel Durumlar örneğine bakın.
try
{
...
client.Close();
}
catch (CommunicationException e)
{
...
client.Abort();
}
catch (TimeoutException e)
{
...
client.Abort();
}
catch (Exception e)
{
...
client.Abort();
throw;
}
Not
deyimi ve ServiceHost
: Birçok kendi kendini barındıran uygulama, bir hizmeti barındırmaktan biraz daha fazlasını yapar ve ServiceHost.Close
nadiren bir özel durum oluşturur, bu nedenle bu tür uygulamalar deyimini ile ServiceHost
güvenli bir şekilde kullanabilirusing
.using
Ancak, ServiceHost.Close
uygulamasını kapattıktan ServiceHost
sonra uygulamanız devam ederse deyiminden using
kaçınmanız ve daha önce verilen deseni CommunicationException
izlemeniz gerekir.
Örneği çalıştırdığınızda, işlem yanıtları ve özel durumlar istemci konsolu penceresinde görüntülenir.
İstemci işlemi, her biri çağrısı Divide
yapmaya çalışan üç senaryo çalıştırır. İlk senaryoda, () özel durumu Dispose
nedeniyle kodun atlandığı gösterilir. İkinci senaryoda , () özel durumu nedeniyle maskelenen önemli bir özel durum Dispose
gösterilmektedir. Üçüncü senaryoda doğru temizleme gösterilmektedir.
İstemci işleminden beklenen çıkış:
=
= Demonstrating problem: closing brace of using statement can throw.
=
Got System.ServiceModel.CommunicationException from Divide.
Got System.ServiceModel.Security.MessageSecurityException
=
= Demonstrating problem: closing brace of using statement can mask other Exceptions.
=
Got System.ServiceModel.CommunicationException from Divide.
Got System.ServiceModel.Security.MessageSecurityException
=
= Demonstrating cleanup with Exceptions.
=
Calling client.Add(0.0, 0.0);
client.Add(0.0, 0.0); returned 0
Calling client.Divide(0.0, 0.0);
Got System.ServiceModel.CommunicationException from Divide.
Press <ENTER> to terminate client.
Örneği ayarlamak, derlemek ve çalıştırmak için
Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.
Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.
Örneği tek veya makineler arası bir yapılandırmada çalıştırmak için Windows Communication Foundation Örneklerini Çalıştırma başlığındaki yönergeleri izleyin.