Grundlegendes zu ZustandsänderungenUnderstanding State Changes

In diesem Thema werden die Zustände und Übergänge in Kanälen, die Typen zum Strukturieren von Kanalzuständen und deren Implementierung erläutert.This topic discusses the states and transitions that channels have, the types used to structure channel states, and how to implement them.

Zustandsautomaten und KanäleState Machines and Channels

Objekte, die die Kommunikation behandeln, wie z. B. Sockets, weisen in der Regel einen Zustandsautomaten auf, dessen Zustandsübergänge sich auf das Zuordnen von Netzwerkressourcen, Herstellen oder Annehmen von Verbindungen oder das Schließen und Beenden einer Kommunikation beziehen.Objects that deal with communication, for example sockets, usually present a state machine whose state transitions relate to allocating network resources, making or accepting connections, closing connections and terminating communication. Der Kanalzustandsautomat stellt ein einheitliches Modell der Zustände eines Kommunikationsobjekt bereit, das die zugrunde liegende Implementierung dieses Objekts abstrahiert.The channel state machine provides a uniform model of the states of a communication object that abstracts the underlying implementation of that object. Die ICommunicationObject-Schnittstelle umfasst eine Reihe von Zuständen, Zustandsübergangsmethoden und Zustandsübergangsereignisse.The ICommunicationObject interface provides a set of states, state transition methods and state transition events. Alle Kanäle, Kanalfactorys und Kanallistener implementieren den Kanalzustandsautomaten.All channels, channel factories and channel listeners implement the channel state machine.

Die Ereignisse Closed, Closing, Faulted, Opened und Opening informieren einen externen Beobachter über einen stattgefundenen Zustandsübergang.The events Closed, Closing, Faulted, Opened and Opening signal an external observer after a state transition occurs.

Die Methoden Abort, Close und Open (und deren asynchrone Entsprechungen) verursachen Zustandsübergänge.The methods Abort, Close, and Open (and their asynchronous equivalents) cause state transitions.

Die Zustandseigenschaft gibt den von CommunicationState definierten aktuellen Zustand zurück:The state property returns the current state as defined by CommunicationState:

ICommunicationObject, CommunicationObject, Zustände und ZustandsübergängeICommunicationObject, CommunicationObject, and States and State Transition

Ein ICommunicationObject beginnt im Created-Zustand, in dem seine verschiedenen Eigenschaften konfiguriert werden können.An ICommunicationObject starts out in the Created state where its various properties can be configured. Sobald sich das Objekt im Opened-Zustand befindet, kann es zum Senden und Empfangen von Nachrichten verwendet werden, seine Eigenschaften sind jedoch unveränderlich.Once in the Opened state, the object is usable for sending and receiving messages but its properties are considered immutable. Im Closing-Zustand kann das Objekt keine neuen Anforderungen senden oder empfangen. Vorhandene Anforderungen können jedoch abgeschlossen werden, sofern der Close-Timeout nicht überschritten wird.Once in the Closing state, the object can no longer process new send or receive requests, but existing requests have a chance to complete until the Close timeout is reached. Bei einem nicht behebbaren Fehler geht das Objekt in den Faulted-Zustand über und kann auf Informationen zum Fehler überprüft und letztendlich geschlossen werden.If an unrecoverable error occurs, the object transitions to the Faulted state where it can be inspected for information about the error and ultimately closed. Im Closed-Zustand hat das Objekt im Wesentlichen das Ende des Zustandsautomats erreicht.When in the Closed state the object has essentially reached the end of the state machine. Nachdem ein Objekt aus einen Zustand in den nächsten übergegangen ist, wechselt es nicht mehr zurück in einen früheren Zustand.Once an object transitions from one state to the next, it does not go back to a previous state.

Das folgende Diagramm veranschaulicht die Zustände und Zustandsübergänge von ICommunicationObject.The following diagram shows the ICommunicationObject states and state transitions. Zustandsübergänge können durch einen Aufruf der folgenden drei Methoden verursacht werden: Abort, Open oder Close.State transitions can be caused by calling one of the three methods: Abort, Open, or Close. Sie können auch durch einen Aufruf anderer Methoden, die von der Implementierung abhängen, verursacht werden.They could also be caused by calling other implementation-specific methods. Ein Übergang in den Faulted-Zustand kann das Ergebnis von Fehlern beim oder nach dem Öffnen eines Kommunikationsobjekts sein.Transitioning to the Faulted state could happen as a result of errors while opening or after having opened the communication object.

Jedes ICommunicationObject beginnt im Created-Zustand.Every ICommunicationObject starts out in the Created state. In diesem Zustand kann eine Anwendung das Objekt konfigurieren, indem dessen Eigenschaften festgelegt werden.In this state, an application can configure the object by setting its properties. Sobald sich ein Objekt in einen anderen Zustand als Created befindet, gilt es als unveränderlich.Once an object is in a state other than Created, it is considered immutable.

Channel Zustand TransititionChannel state transitition
Abbildung 1.Figure 1. Der ICommunicationObject-Zustandsautomat.The ICommunicationObject State Machine.

Windows Communication Foundation (WCF) bietet eine abstrakte Basisklasse, die mit dem Namen CommunicationObject implementiert ICommunicationObject und den kanalzustandsautomaten.Windows Communication Foundation (WCF) provides an abstract base class named CommunicationObject that implements ICommunicationObject and the channel state machine. In der folgenden Grafik wird ein Diagramm mit Zustandsänderungen dargestellt, das sich auf CommunicationObject bezieht.The following graphic is a modified state diagram that is specific to CommunicationObject. Neben dem ICommunicationObject-Zustandsautomaten zeigt es die zeitliche Steuerung, nach der weitere CommunicationObject-Methoden aufgerufen werden.In addition to the ICommunicationObject state machine, it shows the timing when additional CommunicationObject methods are invoked.

StatusänderungenState changes
Abbildung 2.Figure 2. Die CommunicationObject-Implementierung des ICommunicationObject-Zustandsautomats, einschließlich Aufrufe von Ereignissen und geschützte Methoden.The CommunicationObject implementation of the ICommunicationObject state machine including calls to events and protected methods.

ICommunicationObject-EreignisseICommunicationObject Events

CommunicationObject macht die fünf von ICommunicationObject definierten Ereignisse verfügbar.CommunicationObject exposes the five events defined by ICommunicationObject. Diese Ereignisse sind für Code vorgesehen, in dem das Kommunikationsobjekt für eine Benachrichtigung über Zustandsübergänge verwendet wird.These events are designed for code using the communication object to be notified of state transitions. Wie oben in Abbildung 2 dargestellt, wird jedes Ereignis einmal ausgelöst, nachdem der Zustand des Objekts in den durch das Ereignis bezeichneten Zustand übergegangen ist.As shown in Figure 2 above, each event is fired once after the object’s state transitions to the state named by the event. Alle fünf Ereignisse sind vom Typ EventHandler, der folgendermaßen definiert wird:All five events are of the EventHandler type which is defined as:

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

In der CommunicationObject-Implementierung ist der Absender entweder CommunicationObject direkt oder das, was darin als Absender an den CommunicationObject-Konstruktor übergeben wurde (wenn diese Konstruktorüberladung verwendet wurde).In the CommunicationObject implementation, the sender is either the CommunicationObject itself or whatever was passed in as the sender to the CommunicationObject constructor (if that constructor overload was used). Der EventArgs-Parameter e ist immer EventArgs.Empty.The EventArgs parameter, e, is always EventArgs.Empty.

Abgeleitete ObjektrückrufeDerived Object Callbacks

Abgesehen von den fünf Ereignissen deklariert CommunicationObject acht geschützte virtuelle Methoden, mit denen ein abgeleitetes Objekt vor und nach dem Eintreten eines Zustandsübergang zurückgerufen werden kann.In addition to the five events, CommunicationObject declares eight protected virtual methods designed to allow a derived object to be called back before and after state transitions occur.

Den Methoden CommunicationObject.Open und CommunicationObject.Close sind jeweils drei solcher Rückrufe zugeordnete.The CommunicationObject.Open and CommunicationObject.Close methods have three such callbacks associated with each of them. Beispielsweise gehören zu CommunicationObject.Open die Rückrufe CommunicationObject.OnOpening, CommunicationObject.OnOpen und CommunicationObject.OnOpened.For example, corresponding to CommunicationObject.Open there is CommunicationObject.OnOpening, CommunicationObject.OnOpen, and CommunicationObject.OnOpened. CommunicationObject.Close sind die Methoden CommunicationObject.OnClose, CommunicationObject.OnClosing und CommunicationObject.OnClosed zugeordnet.Associated with CommunicationObject.Close are the CommunicationObject.OnClose, CommunicationObject.OnClosing, and CommunicationObject.OnClosed methods.

Entsprechend verfügt die CommunicationObject.Abort-Methode über eine zugehörige CommunicationObject.OnAbort-Methode.Similarly, the CommunicationObject.Abort method has a corresponding CommunicationObject.OnAbort.

CommunicationObject.OnOpen, CommunicationObject.OnClose und CommunicationObject.OnAbort weisen keine Standardimplementierung auf. Die anderen Rückrufe besitzen hingegen eine Standardimplementierung, die für die Richtigkeit des Zustandsautomats erforderlich ist.While CommunicationObject.OnOpen, CommunicationObject.OnClose, and CommunicationObject.OnAbort have no default implementation, the other callbacks do have a default implementation which is necessary for state machine correctness. Stellen Sie beim Überschreiben dieser Methoden sicher, dass Sie die Basisimplementierung aufrufen oder ordnungsgemäß ersetzen.If you override those methods be sure to call the base implementation or correctly replace it.

CommunicationObject.OnOpening, CommunicationObject.OnClosing und CommunicationObject.OnFaulted lösen das entsprechende Ereignis CommunicationObject.Opening, CommunicationObject.Closing und CommunicationObject.Faulted aus.CommunicationObject.OnOpening, CommunicationObject.OnClosing and CommunicationObject.OnFaulted fire the corresponding CommunicationObject.Opening, CommunicationObject.Closing and CommunicationObject.Faulted events. CommunicationObject.OnOpened und CommunicationObject.OnClosed legen den Objektstatus auf jeweils Opened und Closed fest und lösen dann die entsprechenden Ereignisse CommunicationObject.Opened und CommunicationObject.Closed aus.CommunicationObject.OnOpened and CommunicationObject.OnClosed set the object state to Opened and Closed respectively then fire the corresponding CommunicationObject.Opened and CommunicationObject.Closed events.

ZustandsübergangsmethodenState Transition Methods

CommunicationObject stellt Implementierungen von Abort, Close und Open bereit.CommunicationObject provides implementations of Abort, Close and Open. Bereitgestellt wird außerdem eine Fault-Methode, die einen Zustandsübergang in den Faulted-Zustand verursacht.It also provides a Fault method which causes a state transition to the Faulted state. Abbildung 2 zeigt den ICommunicationObject-Zustandsautomaten. Dabei wird jeder Übergang durch die Methode bezeichnet, die ihn verursacht hat (nicht bezeichnete Übergänge treten innerhalb der Implementierung der Methode auf, die den letzten bezeichneten Übergang verursacht hat).Figure 2 shows the ICommunicationObject state machine with each transition labeled by the method that causes it (unlabeled transitions happen inside the implementation of the method that caused the last labeled transition).

Hinweis

Bei allen CommunicationObject-Implementierungen des Kommunikationszustands gets/sets sind die Threads synchronisiert.All CommunicationObject implementations of communication state gets/sets are thread-synchronized.

KonstruktorConstructor

CommunicationObject stellt drei Konstruktoren bereit, von denen alle das Objekt im Created-Zustand belassen.CommunicationObject provides three constructors, all of which leave the object in the Created state. Die Konstruktoren werden wie folgt definiert:The constructors are defined as:

Der erste Konstruktor ist ein Standardkonstruktor und führt eine Delegierung an die Konstruktorüberladung aus, die ein Objekt akzeptiert:The first constructor is a default constructor that delegates to the constructor overload that takes an object:

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

Der Konstruktor, der ein Objekt akzeptiert, verwendet diesen Parameter als das zu sperrende Objekt, wenn der Zugriff auf den Zustand des Kommunikationsobjekts synchronisiert wird:The constructor that takes an object uses that parameter as the object to be locked when synchronizing access to communication object state:

protected CommunicationObject(object mutex) { … }

Ein dritter Konstruktor akzeptiert einen weiteren Parameter, der als Absenderargument verwendet, wenn ICommunicationObject-Ereignisse ausgelöst werden.Finally, a third constructor takes an additional parameter that is used as the sender argument when ICommunicationObject events are fired.

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

Die vorherigen beiden Konstruktoren legen den Absender auf dieses Argument fest.The previous two constructors set the sender to this.

Open-MethodeOpen Method

Vorbedingung: Der Zustand ist Created.Precondition: State is Created.

Nachbedingung: Der Zustand ist Opened oder Faulted.Post-condition: State is Opened or Faulted. Möglicherweise wird eine Ausnahme ausgelöst.May throw an exception.

Die Open()-Methode versucht, das Kommunikationsobjekt zu öffnen und den Zustand auf Opened festzulegen.The Open() method will try to open the communication object and set the state to Opened. Falls ein Fehler auftritt, legt sie den Zustand auf Faulted festgelegt.If it encounters an error, it will set the state to Faulted.

Die Methode, überprüft zuerst, ob Created der aktuelle Zustand ist.The method first checks that the current state is Created. Wenn der aktuelle Zustand Opening oder Opened lautet, löst sie InvalidOperationException aus.If the current state is Opening or Opened it throws an InvalidOperationException. Ist Closing oder Closed der aktuelle Zustand, löst sie CommunicationObjectAbortedException aus, wenn das Objekt beendet worden ist, andernfalls löst sie ObjectDisposedException aus.If the current state is Closing or Closed, it throws a CommunicationObjectAbortedException if the object has been terminated and ObjectDisposedException otherwise. Ist Faulted der aktuelle Zustand, löst sie CommunicationObjectFaultedException aus.If the current state is Faulted, it throws a CommunicationObjectFaultedException.

Anschließend legt sie den Zustand auf Opening fest und ruft OnOpening() (wodurch das Opening-Ereignis ausgelöst wird), OnOpen() und OnOpened() in dieser Reihenfolge auf.It then sets the state to Opening and calls OnOpening() (which raises the Opening event), OnOpen() and OnOpened() in that order. OnOpened() legt den Zustand auf Opened fest und löst das Opened-Ereignis aus.OnOpened() sets the state to Opened and raises the Opened event. Wenn währenddessen eine Ausnahme ausgelöst wird, ruft Open() Fault() auf und übergibt die Ausnahme.If any of these throws an exception, Open()calls Fault() and lets the exception bubble up. Das folgende Diagramm zeigt den Open-Prozess im Detail.The following diagram shows the Open process in more detail.

StatusänderungenState changes
Überschreiben Sie die OnOpen-Methode, und implementieren Sie eine benutzerdefinierte Open-Logik, z. B. das Öffnen eines inneren Kommunikationsobjekts.Override the OnOpen method to implement custom open logic such as opening an inner communication object.

Close-MethodeClose Method

Vorbedingung: Keine.Precondition: None.

Nachbedingung: Der Zustand ist Closed.Post-condition: State is Closed. Möglicherweise wird eine Ausnahme ausgelöst.May throw an exception.

Die Close()-Methode kann bei jedem Zustand aufgerufen werden.The Close() method can be called at any state. Sie versucht, das Objekt ordnungsgemäß zu schließen.It tries to close the object normally. Bei einem Fehler beendet sie das Objekt.If an error is encountered, it terminates the object. Die Methode bewirkt nichts, wenn der aktuelle Zustand Closing oder Closed lautet.The method does nothing if the current state is Closing or Closed. Andernfalls legt sie den Zustand auf Closing fest.Otherwise it sets the state to Closing. Wenn der ursprüngliche Zustand Created, Opening oder Faulted lautete, ruft sie Abort() auf (siehe folgendes Diagramm).If the original state was Created, Opening or Faulted, it calls Abort() (see the following diagram). Wenn der ursprüngliche Zustand Opened lautete, ruft sie OnClosing (wodurch das Opening-Ereignis ausgelöst wird), OnOpen() und OnOpened() in dieser Reihenfolge auf.If the original state was Opened, it calls OnClosing() (which raises the Closing event), OnClose() and OnClosed() in that order. Wenn währenddessen eine Ausnahme ausgelöst wird, ruft Close() Abort() auf und übergibt die Ausnahme.If any of these throws an exception, Close()calls Abort() and lets the exception bubble up. OnClosed() legt den Zustand auf Closed fest und löst das Closed-Ereignis aus.OnClosed() sets the state to Closed and raises the Closed event. Das folgende Diagramm zeigt den Close-Prozess im Detail.The following diagram shows the Close process in more detail.

StatusänderungenState changes
Überschreiben Sie die OnClose-Methode und implementieren Sie eine benutzerdefinierte Close-Logik, z. B. das Schließen eines inneren Kommunikationsobjekts.Override the OnClose method to implement custom close logic, such as closing an inner communication object. Jede ordnungsgemäß schließende Logik, die eine längere Blockierung mit sich bringt (z. B. das Warten auf eine Antwort) sollte in OnClose() implementiert werden, da diese Methode einen Timeoutparameter akzeptiert und nicht als Teil von Abort() aufgerufen wird.All graceful closing logic that may block for a long time (for example, waiting for the other side to respond) should be implemented in OnClose() because it takes a timeout parameter and because it is not called as part of Abort().

AbbrechenAbort

Vorbedingung: Keine.Precondition: None.
Nachbedingung: Der Zustand ist Closed.Post-condition: State is Closed. Möglicherweise wird eine Ausnahme ausgelöst.May throw an exception.

Die Abort()-Methode bewirkt nichts, wenn der aktuelle Zustand Closed lautet oder wenn das Objekt zuvor beendet worden ist (z. B. indem Abort() für einen anderen Thread ausgeführt wird).The Abort() method does nothing if the current state is Closed or if the object has been terminated before (for example, possibly by having Abort() executing on another thread). Andernfalls legt sie den Zustand auf Closing fest und ruft OnClosing() (wodurch das Closing-Ereignis ausgelöst wird), OnAbort() und OnClosed() in dieser Reihenfolge auf. (OnClose wird nicht aufgerufen, da das Objekt beendet, nicht geschlossen wird.)Otherwise it sets the state to Closing and calls OnClosing() (which raises the Closing event), OnAbort(), and OnClosed() in that order (does not call OnClose because the object is being terminated, not closed). OnClosed() legt den Zustand auf Closed fest und löst das Closed-Ereignis aus.OnClosed() sets the state to Closed and raises the Closed event. Wenn währenddessen eine Ausnahme ausgelöst wird, wird sie erneut für den Aufrufer von Abort ausgelöst.If any of these throw an exception, it is re-thrown to the caller of Abort. Implementierungen von OnClosing(), OnClosed() und OnAbort() sollten keine Blockierung hervorrufen (z. B. bei Ein-/Ausgaben).Implementations of OnClosing(), OnClosed() and OnAbort() should not block (for example, on input/output). Das folgende Diagramm zeigt den Abort-Prozess im Detail.The following diagram shows the Abort process in more detail.

StatusänderungenState changes
Überschreiben Sie die OnAbort-Methode, und implementieren Sie eine benutzerdefinierte Terminate-Logik, z. B. das Beenden eines inneren Kommunikationsobjekts.Override the OnAbort method to implement custom terminate logic such as terminating an inner communication object.

FaultFault

Die Fault-Methode bezieht sich speziell auf CommunicationObject und ist kein Bestandteil der ICommunicationObject-Schnittstelle.The Fault method is specific to CommunicationObject and is not part of the ICommunicationObject interface. Sie wird hier nur aus Gründen der Vollständigkeit aufgeführt.It is included here for completeness.

Vorbedingung: Keine.Precondition: None.

Nachbedingung: Der Zustand ist Faulted.Post-condition: State is Faulted. Möglicherweise wird eine Ausnahme ausgelöst.May throw an exception.

Die Fault()-Methode bewirkt nichts, wenn der aktuelle Zustand Faulted oder Closed lautet.The Fault() method does nothing if the current state is Faulted or Closed. Andernfalls legt sie den Zustand auf Faulted fest und ruft OnFaulted() auf, wodurch das Faulted-Ereignis ausgelöst wird.Otherwise it sets the state to Faulted and call OnFaulted(), which raises the Faulted event. Wenn OnFaulted eine Ausnahme auslöst, wird sie erneut ausgelöst.If OnFaulted throws an exception it is re-thrown.

ThrowIfXxx-MethodenThrowIfXxx Methods

CommunicationObject verfügt über drei geschützte Methoden, mit denen Ausnahmen ausgelöst werden können, wenn sich das Objekt in einem bestimmten Zustand befindet.CommunicationObject has three protected methods that can be used to throw exceptions if the object is in a specific state.

ThrowIfDisposed löst eine Ausnahme aus, wenn der Zustand Closing, Closed oder Faulted lautet.ThrowIfDisposed throws an exception if the state is Closing, Closed or Faulted.

ThrowIfDisposedOrImmutable löst eine Ausnahme aus, wenn der Zustand nicht Created lautet.ThrowIfDisposedOrImmutable throws an exception if the state is not Created.

ThrowIfDisposedOrNotOpen löst eine Ausnahme aus, wenn der Zustand nicht Opened lautet.ThrowIfDisposedOrNotOpen throws an exception if the state is not Opened.

Die ausgelösten Ausnahmen hängen vom Zustand ab.The exceptions thrown depend on the state. Die folgende Tabelle enthält die verschiedenen Zustände und den entsprechende Ausnahmetyp, der durch einen Aufruf von ThrowIfXxx zu diesem Zustand ausgelöst wird.The following table shows the different states and the corresponding exception type thrown by calling a ThrowIfXxx that throws on that state.

ZustandState Wurde Abort aufgerufen?Has Abort been called? AusnahmeException
CreatedCreated Nicht zutreffendN/A System.InvalidOperationException
OpeningOpening Nicht zutreffendN/A System.InvalidOperationException
OpenedOpened Nicht zutreffendN/A System.InvalidOperationException
SchließendeClosing JaYes System.ServiceModel.CommunicationObjectAbortedException
SchließendeClosing NeinNo System.ObjectDisposedException
GeschlossenClosed JaYes System.ServiceModel.CommunicationObjectAbortedException im Fall, dass ein Objekt durch einen vorherigen, expliziten Aufruf von Abort geschlossen wurde.System.ServiceModel.CommunicationObjectAbortedException in the case that an object was closed by a previous and explicit call of Abort. Wenn Sie Close für das Objekt aufrufen, wird System.ObjectDisposedException ausgelöst.If you call Close on the object then an System.ObjectDisposedException is thrown.
GeschlossenClosed NeinNo System.ObjectDisposedException
FaultedFaulted Nicht zutreffendN/A System.ServiceModel.CommunicationObjectFaultedException

TimeoutsTimeouts

Mehrere der besprochenen Methoden akzeptieren Timeoutparameter.Several of the methods we discussed take timeout parameters. Dazu gehören Close, Open (bestimmte Überladungen und asynchrone Versionen), OnClose und OnOpen.These are Close, Open (certain overloads and asynchronous versions), OnClose and OnOpen. Diese Methoden wurden für langwierige Vorgänge entwickelt (z. B. das Blockieren bei Ein-/Ausgaben beim ordnungsgemäßen Schließen einer Verbindung)), damit mit dem Timeoutparameter angegeben werden kann, wie lange dieser Vorgang dauern darf, bevor er unterbrochen wird.These methods are designed to allow for lengthy operations (for example, blocking on input/output while gracefully closing down a connection) so the timeout parameter indicates how long such operations can take before being interrupted. Implementierungen dieser Methoden sollten den bereitgestellten Timeoutwert verwenden, um sicherzustellen, dass die Rückgabe an den Aufrufer innerhalb dieses Timeouts erfolgt.Implementations of any of these methods should use the supplied timeout value to ensure it returns to the caller within that timeout. Implementierungen anderer Methoden, die keinen Timeoutwert akzeptieren, sind nicht für langwierige Vorgänge bestimmt und sollten bei Ein-/Ausgaben keine Blockierung verursachen.Implementations of other methods that do not take a timeout are not designed for lengthy operations and should not block on input/output.

Zu den Ausnahmen zählen die Überladungen Open() und Close(), die keinen Timeout akzeptieren.The exception are the Open() and Close() overloads that do not take a timeout. Diese Überladungen verwenden einen Timeoutwert, der von der abgeleiteten Klasse bereitgestellt wird.These use a default timeout value supplied by the derived class. CommunicationObject macht zwei geschützte abstrakte Eigenschaften mit der Bezeichnung DefaultCloseTimeout und DefaultOpenTimeout verfügbar, die wie folgt definiert werden:CommunicationObject exposes two protected abstract properties named DefaultCloseTimeout and DefaultOpenTimeout defined as:

protected abstract TimeSpan DefaultCloseTimeout { get; }

protected abstract TimeSpan DefaultOpenTimeout { get; }

Eine abgeleitete Klasse implementiert diese Eigenschaften, um für die Überladungen Open() und Close(), die keinen Timeoutwert akzeptieren, den Standardtimeout bereitzustellen.A derived class implements these properties to provide the default timeout for the Open() and Close() overloads that do not take a timeout value. Dann führen die Implementierungen von Open() und Close() eine Delegierung an die Überladung aus, die einen Timeout akzeptiert und übergeben ihr den Standardtimeoutwert. Beispiel:Then the Open() and Close() implementations delegate to the overload that takes a timeout passing it the default timeout value, for example:

public void Open()

{

this.Open(this.DefaultOpenTimeout);

}

IDefaultCommunicationTimeoutsIDefaultCommunicationTimeouts

Diese Schnittstelle verfügt über vier schreibgeschützte Eigenschaften, um Standardtimeoutwerte für Open, Send, Receive und Close bereitzustellen.This interface has four read-only properties for providing default timeout values for open, send, receive, and close. Jede Implementierung muss die Standardwerte auf die entsprechend angebrachte Weise implementieren.Each implementation is responsible for obtaining the default values in whatever manner appropriate. Zur Vereinfachung lege ChannelFactoryBase und ChannelListenerBase diese Werte standardmäßig auf jeweils 1 Minute fest.As a convenience, ChannelFactoryBase and ChannelListenerBase default these values to 1 minute each.