Aracılığıyla paylaş


Durum Değişikliklerini Anlama

Bu konu başlığında kanalların sahip olduğu durumlar ve geçişler, kanal durumlarını yapılandırmak için kullanılan türler ve bunların nasıl uygulanılacağı açıklanır.

Durum Makineleri ve Kanallar

Yuvalar gibi iletişimle ilgilenen nesneler genellikle durum geçişleri ağ kaynaklarını ayırma, bağlantı kurma veya kabul etme, bağlantıları kapatma ve iletişimi sonlandırma ile ilgili bir durum makinesi sunar. Kanal durumu makinesi, iletişim nesnesinin temel alınan uygulamasını soyutlayan durumlarının tekdüzen bir modelini sağlar. Arabirim ICommunicationObject bir durum kümesi, durum geçiş yöntemleri ve durum geçiş olayları sağlar. Tüm kanallar, kanal fabrikaları ve kanal dinleyicileri kanal durum makinesini uygular.

Kapalı, Kapatılıyor, Hatalı, Açıldı ve Açılıyor olayları, durum geçişi gerçekleştikten sonra dış gözlemciye işaret eder.

Abort, Close ve Open yöntemleri (ve bunların zaman uyumsuz eşdeğerleri) durum geçişlerine neden olur.

state özelliği tarafından CommunicationStatetanımlanan geçerli durumu döndürür:

ICommunicationObject, CommunicationObject ve States and State Transition

, ICommunicationObject çeşitli özelliklerinin yapılandırılabildiği Oluşturuldu durumunda başlar. Açıldı durumundan sonra, nesne ileti göndermek ve almak için kullanılabilir ancak özellikleri sabit olarak kabul edilir. Kapatma durumundan sonra nesne artık yeni gönderme veya alma isteklerini işleyemez, ancak mevcut isteklerin Kapatma zaman aşımına ulaşılana kadar tamamlanma şansı olur. Kurtarılamaz bir hata oluşursa, nesne hata hakkında bilgi için incelenip sonunda kapatılabilen Hatalı durumuna geçirilir. Kapalı durumdayken nesne temelde durum makinesinin sonuna ulaşmıştır. Bir nesne bir durumdan diğerine geçtiğinde önceki duruma geri dönmez.

Aşağıdaki diyagramda ICommunicationObject durum ve durum geçişleri gösterilmektedir. Durum geçişleri üç yöntemden birinin çağrılmasından kaynaklanabilir: Abort, Open veya Close. Bunlara uygulamaya özgü diğer yöntemlerin çağrılması da neden olabilir. Hatalı duruma geçiş, iletişim nesnesini açarken veya açtıktan sonra oluşan hataların bir sonucu olarak gerçekleşebilir.

Her ICommunicationObject şey Oluşturuldu durumunda başlar. Bu durumda, bir uygulama özelliklerini ayarlayarak nesneyi yapılandırabilir. Bir nesne Oluşturuldu dışında bir durumda olduğunda sabit kabul edilir.

Dataflow diagram of the channel state transition.
Şekil 1. ICommunicationObject Durum Makinesi.

Windows Communication Foundation (WCF), ve kanal durum makinesini uygulayan ICommunicationObject adlı CommunicationObject soyut bir temel sınıf sağlar. Aşağıdaki grafik, öğesine CommunicationObjectözgü değiştirilmiş bir durum diyagramıdır. Durum makinesine ICommunicationObject ek olarak, ek CommunicationObject yöntemlerin çağrıldığı zamanlamayı gösterir.

Dataflow diagram of CommunicationObject implementation state changes. Şekil 2. Olaylara çağrılar ve korumalı yöntemler de dahil olmak üzere ICommunicationObject durum makinesinin CommunicationObject uygulaması.

ICommunicationObject Olayları

CommunicationObject tarafından ICommunicationObjecttanımlanan beş olayı kullanıma sunar. Bu olaylar, durum geçişlerinin bildirilmesi için iletişim nesnesini kullanan kodlar için tasarlanmıştır. Yukarıdaki Şekil 2'de gösterildiği gibi, nesnenin durumu olay tarafından adlandırılan duruma geçtikten sonra her olay bir kez tetiklenir. Beş olayın tümü de EventHandler şu şekilde tanımlanan türdedir:

public delegate void EventHandler(object sender, EventArgs e);

CommunicationObject Uygulamada, gönderen kendisidir veya oluşturucuya CommunicationObject gönderen olarak geçirilen öğedir CommunicationObject (oluşturucu aşırı yüklemesi kullanıldıysa). EventArgs parametresi eher zaman EventArgs.Emptyşeklindedir.

Türetilmiş Nesne Geri Çağırmaları

Beş olaya ek olarak, CommunicationObject türetilmiş bir nesnenin durum geçişleri gerçekleşmeden önce ve sonra çağrılmasına izin vermek için tasarlanmış sekiz korumalı sanal yöntem bildirir.

CommunicationObject.Open ve CommunicationObject.Close yöntemleri, her biriyle ilişkili üç tür geri çağırmaya sahiptir. Örneğin, öğesine karşılık gelen CommunicationObject.Open , CommunicationObject.OnOpenve CommunicationObject.OnOpenedolurCommunicationObject.OnOpening. ile CommunicationObject.Close ilişkilendirilmiş olan CommunicationObject.OnClose, CommunicationObject.OnClosingve CommunicationObject.OnClosed yöntemleridir.

Benzer şekilde, yöntemine CommunicationObject.Abort karşılık gelen CommunicationObject.OnAbortbir vardır.

CommunicationObject.OnOpen, CommunicationObject.OnCloseve CommunicationObject.OnAbort varsayılan uygulaması olmasa da, diğer geri çağırmaların durum makinesi doğruluğu için gerekli olan varsayılan bir uygulaması vardır. Bu yöntemleri geçersiz kılarsanız temel uygulamayı çağırdığınızdan veya doğru şekilde değiştirdiğinizden emin olun.

CommunicationObject.OnOpeningCommunicationObject.OnFaulted ve CommunicationObject.OnClosing karşılık gelen CommunicationObject.Openingve CommunicationObject.ClosingCommunicationObject.Faulted olaylarını tetikler. CommunicationObject.OnOpened ve CommunicationObject.OnClosed nesne durumunu sırasıyla Açık ve Kapalı olarak ayarlayın, ardından karşılık gelen CommunicationObject.Opened ve CommunicationObject.Closed olaylarını tetikleyin.

Durum Geçiş Yöntemleri

CommunicationObject Abort, Close ve Open uygulamalarını sağlar. Ayrıca, Hatalı duruma bir durum geçişi neden olan bir Hata yöntemi sağlar. Şekil 2'de, her geçişe neden olan yöntemle etiketlenmiş durum makinesi gösterilmektedir ICommunicationObject (etiketlenmemiş geçişler, son etiketli geçişe neden olan yöntemin uygulamasında gerçekleşir).

Not

İletişim durumunun tüm CommunicationObject uygulamaları alır/kümeler iş parçacığıyla eşitlenir.

Oluşturucu

CommunicationObject üç oluşturucu sağlar ve bunların tümü nesneyi Oluşturuldu durumunda bırakır. Oluşturucular şöyle tanımlanır:

İlk oluşturucu, bir nesneyi alan oluşturucu aşırı yüklemesine temsilcilik eden parametresiz bir oluşturucudur:

protected CommunicationObject() : this(new object()) { … }

Bir nesneyi alan oluşturucu, iletişim nesnesi durumuna erişimi eşitlerken kilitlenecek nesne olarak bu parametreyi kullanır:

protected CommunicationObject(object mutex) { … }

Son olarak, üçüncü bir oluşturucu olaylar tetiklendiğinde ICommunicationObject gönderen bağımsız değişkeni olarak kullanılan ek bir parametre alır.

protected CommunicationObject(object mutex, object eventSender) { … }

Önceki iki oluşturucu göndereni buna ayarlamıştı.

Open Yöntemi

Önkoşul: Durum Oluşturuldu.

Son koşul: Durum Açık veya Hatalı. Özel durum oluşturabilir.

Open() yöntemi, iletişim nesnesini açmaya çalışır ve durumu Açık olarak ayarlar. Hatayla karşılaşırsa durumu Hatalı olarak ayarlar.

yöntemi önce geçerli durumun Oluşturuldu olup olmadığını denetler. Geçerli durum Açılıyor veya Açıldı ise, bir InvalidOperationExceptionoluşturur. Geçerli durum Kapatılıyor veya Kapatıldı ise, nesne sonlandırıldıysa ve ObjectDisposedException yoksa bir CommunicationObjectAbortedException oluşturur. Geçerli durum Hatalı ise, bir CommunicationObjectFaultedExceptionoluşturur.

Ardından durumu Opening olarak ayarlar ve OnOpening() (Açılış olayını yükseltir), OnOpen() ve OnOpened() öğesini bu sırayla çağırır. OnOpened() durumu Opened olarak ayarlar ve Opened olayını başlatır. Bunlardan herhangi biri özel durum oluşturursa, Open(), Fault() öğesini çağırır ve özel durumun kabarcık oluşturmasına izin verir. Aşağıdaki diyagramda Açma işlemi daha ayrıntılı olarak gösterilmektedir.

Dataflow diagram of ICommunicationObject.Open state changes.
İç iletişim nesnesini açma gibi özel açık mantık uygulamak için OnOpen yöntemini geçersiz kılın.

Close Yöntemi

Önkoşul: Yok.

Son koşul: Durum Kapalıdır. Özel durum oluşturabilir.

Close() yöntemi herhangi bir durumda çağrılabilir. Nesneyi normal şekilde kapatmaya çalışır. Bir hatayla karşılaşılırsa, nesnesi sonlandırılır. Geçerli durum Kapatılıyor veya Kapatıldı ise yöntemi hiçbir şey yapmaz. Aksi takdirde, durumu Kapatılıyor olarak ayarlar. Özgün durum Oluşturuldu, Açılıyor veya Hatalı ise Abort() çağrısı yapar (aşağıdaki diyagrama bakın). Özgün durum Opened ise, OnClosing() (Closing olayını yükseltir), OnClose() ve OnClosed() öğesini bu sırada çağırır. Bunlardan herhangi biri özel durum oluşturursa Close(), Abort() öğesini çağırır ve özel durumun kabarcığını sağlar. OnClosed() durumu Kapalı olarak ayarlar ve Closed olayını tetikler. Aşağıdaki diyagramda Kapat işlemi daha ayrıntılı olarak gösterilmektedir.

Dataflow diagram of ICommunicationObject.Close state changes.
Bir iç iletişim nesnesini kapatma gibi özel kapatma mantığı uygulamak için OnClose yöntemini geçersiz kılın. Uzun süre engelleyebilecek tüm düzgün kapatma mantığı (örneğin, diğer tarafın yanıt vermesini beklemek) bir zaman aşımı parametresi aldığından ve Abort() parçası olarak çağrılmadığından OnClose() içinde uygulanmalıdır.

Durdur

Önkoşul: Yok.
Son koşul: Durum Kapalıdır. Özel durum oluşturabilir.

Geçerli durum Kapalı olduğunda veya nesne daha önce sonlandırıldıysa (örneğin, başka bir iş parçacığında Abort() yürütülerek) Abort() yöntemi hiçbir şey yapmaz. Aksi takdirde, durumu Kapanış olarak ayarlar ve OnClosing() (Closing olayını yükseltir), OnAbort() ve OnClosed() öğesini bu sırayla çağırır (nesne sonlandırıldığından OnClose'u çağırmaz, kapatılmaz). OnClosed() durumu Kapalı olarak ayarlar ve Closed olayını tetikler. Bunlardan herhangi biri özel durum oluşturursa, Abort çağıranına yeniden oluşturulur. OnClosing(), OnClosed() ve OnAbort() uygulamalarının engellenmemesi gerekir (örneğin, giriş/çıkışta). Aşağıdaki diyagramda İptal işlemi daha ayrıntılı olarak gösterilmektedir.

Dataflow diagram of ICommunicationObject.Abort state changes.
İç iletişim nesnesini sonlandırma gibi özel sonlandırma mantığı uygulamak için OnAbort yöntemini geçersiz kılın.

Hatam

Fault yöntemi, arabirimin ICommunicationObject bir parçası değildir ve öğesine CommunicationObject özgüdür. Tamlık için buraya dahildir.

Önkoşul: Yok.

Son koşul: Durum Hatalı. Özel durum oluşturabilir.

Geçerli durum Hatalı veya Kapalı olduğunda Fault() yöntemi hiçbir şey yapmaz. Aksi takdirde durumu Faulted olarak ayarlar ve OnFaulted() öğesini çağırarak Faulted olayını tetikler. OnFaulted bir özel durum oluşturursa yeniden oluşturulur.

ThrowIfXxx Yöntemleri

CommunicationObject, nesne belirli bir durumdaysa özel durumlar oluşturmak için kullanılabilecek üç korumalı yönteme sahiptir.

ThrowIfDisposed Durum Kapatılıyor, Kapatıldı veya Hatalı ise bir özel durum oluşturur.

ThrowIfDisposedOrImmutable durum Oluşturuldu değilse bir özel durum oluşturur.

ThrowIfDisposedOrNotOpen durum Açık değilse bir özel durum oluşturur.

Oluşan özel durumlar duruma bağlıdır. Aşağıdaki tabloda farklı durumlar ve bu duruma atılan ThrowIfXxx çağrılarak oluşan ilgili özel durum türü gösterilmektedir.

Durum Abort çağrıldı mı? Özel durum
Oluşturulan Yok System.InvalidOperationException
Açılış Yok System.InvalidOperationException
Açıldı Yok System.InvalidOperationException
Kapatma Yes System.ServiceModel.CommunicationObjectAbortedException
Kapatma Hayır System.ObjectDisposedException
Closed Yes System.ServiceModel.CommunicationObjectAbortedException bir nesnenin önceki ve açık bir Abort çağrısı tarafından kapatılması durumunda. Nesnede Close çağrısı yaparsanız bir System.ObjectDisposedException oluşturulur.
Closed Hayır System.ObjectDisposedException
Hatalı Yok System.ServiceModel.CommunicationObjectFaultedException

Zaman aşımları

Ele aldığımız yöntemlerin birkaçı zaman aşımı parametrelerini alır. Bunlar Close, Open (belirli aşırı yüklemeler ve zaman uyumsuz sürümler), OnClose ve OnOpen'dır. Bu yöntemler, uzun işlemlere (örneğin, bir bağlantıyı düzgün bir şekilde kapatırken giriş/çıkışta engelleme) izin verecek şekilde tasarlanmıştır, böylece zaman aşımı parametresi bu işlemlerin kesintiye uğramadan önce ne kadar sürebileceğini gösterir. Bu yöntemlerden herhangi birinin uygulamaları, bu zaman aşımı içinde çağırana geri döndüğünden emin olmak için sağlanan zaman aşımı değerini kullanmalıdır. Zaman aşımı almayan diğer yöntemlerin uygulamaları uzun işlemler için tasarlanmamıştır ve giriş/çıkışta engellememelidir.

Özel durum, zaman aşımına neden olmayan Open() ve Close() aşırı yüklemeleridir. Bunlar türetilmiş sınıf tarafından sağlanan varsayılan bir zaman aşımı değeri kullanır. CommunicationObject adlı DefaultCloseTimeout ve DefaultOpenTimeout olarak tanımlanan iki korumalı soyut özelliği kullanıma sunar:

protected abstract TimeSpan DefaultCloseTimeout { get; }

protected abstract TimeSpan DefaultOpenTimeout { get; }

Türetilmiş bir sınıf, bir zaman aşımı değeri almayan Open() ve Close() aşırı yüklemeleri için varsayılan zaman aşımını sağlamak üzere bu özellikleri uygular. Ardından Open() ve Close() uygulamaları, varsayılan zaman aşımı değerini geçirerek zaman aşımına neden olan aşırı yüklemeye temsilcidir, örneğin:

public void Open()

{

this.Open(this.DefaultOpenTimeout);

}

Idefaultcommunicationtimeouts

Bu arabirim, açma, gönderme, alma ve kapatma için varsayılan zaman aşımı değerleri sağlamaya yönelik dört salt okunur özelliğe sahiptir. Her uygulama, varsayılan değerleri uygun şekilde almaktan sorumludur. Kolaylık ChannelFactoryBase olması için bu ChannelListenerBase değerleri her birinde 1 dakika olarak varsayılan olarak belirleyin.