Aracılığıyla paylaş


Ağ bağlantıları bırakıldığında yayın kaynaklarını güvenli bir şekilde kapatma ve durdurma

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 Disposesonuç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 Disposedışı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ı Abortyapmak 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

using deyimi ve ServiceHost: Birçok kendi kendine barındırma uygulaması bir hizmeti barındırmaktan çok az şey yapar ve ServiceHost.Close nadiren bir özel durum oluşturur, bu nedenle bu tür uygulamalar ServiceHost ile using deyimini güvenle kullanabilir. Ancak, ServiceHost.Close'un bir CommunicationExceptionoluşturabileceğini unutmayın, bu nedenle uygulamanız ServiceHost'u kapattıktan sonra devam ederse, using deyiminden kaçınmanız ve daha önce verilen deseni 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ı Divideyapmaya çalışan üç senaryo çalıştırır. İlk senaryoda, () özel durumu Disposenedeniyle kodun atlandığı gösterilir. İkinci senaryoda , () özel durumu nedeniyle maskelenen önemli bir özel durum Disposegö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

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çö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.

  3. Ö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.