Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

IObserver<T>-Schnittstelle

.NET Framework (current version)
 

Veröffentlicht: Oktober 2016

Stellt einen Mechanismus für den Empfang von Pushbenachrichtigungen bereit.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

public interface IObserver<in T>

Typparameter

inT

Das Objekt, das Benachrichtigungsinformationen bereitstellt.

NameBeschreibung
System_CAPS_pubmethodOnCompleted()

Benachrichtigt den Beobachter, dass der Anbieter das Senden von Pushbenachrichtigungen abgeschlossen hat.

System_CAPS_pubmethodOnError(Exception)

Benachrichtigt den Beobachter, dass beim Anbieter eine Fehlerbedingung aufgetreten ist.

System_CAPS_pubmethodOnNext(T)

Stellt die neuen Daten für den Beobachter bereit.

Die IObserver<T> und IObservable<T> Schnittstellen bieten einen generalisierten Mechanismus für Pushbenachrichtigungen, auch bekannt als das Entwurfsmuster "Beobachter". Die IObservable<T> Schnittstelle stellt die Klasse dar, das Benachrichtigungen (Anbieter); sendet die IObserver<T> Schnittstelle stellt die Klasse, die sie empfängt (Beobachter) dar. TStellt die Klasse, die die Benachrichtigungsinformationen bereitstellt.

Ein IObserver<T> ordnet die Implementierung zum Empfangen von Benachrichtigungen von einem Anbieter (ein IObservable<T> Implementierung) durch Übergabe einer Instanz von sich selbst an des Anbieters IObservable<T>.Subscribe Methode. Diese Methode gibt ein IDisposable -Objekt, das verwendet werden kann, den Beobachter, bevor der Anbieter kündigen des Abonnements abgeschlossen ist, Senden von Benachrichtigungen.

Die IObserver<T> Schnittstelle definiert die folgenden drei Methoden, die die "Beobachter" implementieren müssen:

  • Die OnNext Methode, die in der Regel von einem Anbieter geben Sie den Beobachter mit neuen Daten oder Status Informationen aufgerufen wird.

  • Die OnError -Methode, die in der Regel wird vom Anbieter aufgerufen, um anzugeben, dass Daten nicht verfügbar, kann nicht zugegriffen werden oder beschädigt ist, oder dass der Anbieter einen anderen Fehlerzustand aufgetreten ist.

  • Die OnCompleted Methode, die in der Regel aufgerufen wird, vom Anbieter, um anzugeben, dass das Senden von Benachrichtigungen an Beobachter abgeschlossen wurde.

Das folgende Beispiel veranschaulicht das Entwurfsmuster "Beobachter". Definiert eine Location Klasse, die Breiten- und Längengrad Informationen enthält.

public struct Location
{
   double lat, lon;

   public Location(double latitude, double longitude)
   {
      this.lat = latitude;
      this.lon = longitude;
   }

   public double Latitude
   { get { return this.lat; } }

   public double Longitude
   { get { return this.lon; } }
}

Die LocationReporter -Klasse stellt die IObserver<T> Implementierung. Es zeigt Informationen über den aktuellen Speicherort in der Konsole aus. Der Konstruktor schließt eine name Parameter, der ermöglicht der LocationReporter Instanz zur Identifizierung der Zeichenfolgenausgabe. Es enthält auch eine Subscribe -Methode, die einen Aufruf an des Anbieters umschließt Subscribe Methode. Dadurch können die Methode, die den zurückgegebenen zuweisen IDisposable Verweis auf eine private Variable. Die LocationReporter -Klasse enthält zudem ein Unsubscribe aufruft der IDisposable.Dispose -Methode des Objekts zurückgegeben wird, indem Sie die IObservable<T>.Subscribe Methode. Der folgende Code definiert die LocationReporter Klasse.

using System;

public class LocationReporter : IObserver<Location>
{
   private IDisposable unsubscriber;
   private string instName;

   public LocationReporter(string name)
   {
      this.instName = name;
   }

   public string Name
   {  get{ return this.instName; } }

   public virtual void Subscribe(IObservable<Location> provider)
   {
      if (provider != null) 
         unsubscriber = provider.Subscribe(this);
   }

   public virtual void OnCompleted()
   {
      Console.WriteLine("The Location Tracker has completed transmitting data to {0}.", this.Name);
      this.Unsubscribe();
   }

   public virtual void OnError(Exception e)
   {
      Console.WriteLine("{0}: The location cannot be determined.", this.Name);
   }

   public virtual void OnNext(Location value)
   {
      Console.WriteLine("{2}: The current location is {0}, {1}", value.Latitude, value.Longitude, this.Name);
   }

   public virtual void Unsubscribe()
   {
      unsubscriber.Dispose();
   }
}

Die LocationTracker -Klasse stellt die IObservable<T> Implementierung. Die TrackLocation Methode ist ein NULL-Werte zu übergeben Location Objekt, das die Breiten- und Längengrad-Daten enthält. Wenn die Location Wert ist kein null, TrackLocation Methodenaufrufe der OnNext -Methode jedes Beobachters.

public class LocationTracker : IObservable<Location>
{
   public LocationTracker()
   {
      observers = new List<IObserver<Location>>();
   }

   private List<IObserver<Location>> observers;

   public IDisposable Subscribe(IObserver<Location> observer) 
   {
      if (! observers.Contains(observer)) 
         observers.Add(observer);
      return new Unsubscriber(observers, observer);
   }

   private class Unsubscriber : IDisposable
   {
      private List<IObserver<Location>>_observers;
      private IObserver<Location> _observer;

      public Unsubscriber(List<IObserver<Location>> observers, IObserver<Location> observer)
      {
         this._observers = observers;
         this._observer = observer;
      }

      public void Dispose()
      {
         if (_observer != null && _observers.Contains(_observer))
            _observers.Remove(_observer);
      }
   }

   public void TrackLocation(Nullable<Location> loc)
   {
      foreach (var observer in observers) {
         if (! loc.HasValue)
            observer.OnError(new LocationUnknownException());
         else
            observer.OnNext(loc.Value);
      }
   }

   public void EndTransmission()
   {
      foreach (var observer in observers.ToArray())
         if (observers.Contains(observer))
            observer.OnCompleted();

      observers.Clear();
   }
}

Wenn die Location Wert null, die TrackLocation -Methode instanziiert einen LocationNotFoundException -Objekt, das im folgenden Beispiel gezeigt wird. Er ruft dann jedes Beobachters OnError Methode und übergibt die LocationNotFoundException Objekt. Beachten Sie, dass LocationNotFoundException leitet sich von Exception , aber keine neuen Elemente hinzugefügt.

public class LocationUnknownException : Exception
{
   internal LocationUnknownException() 
   { }
}

Beobachter registrieren sich zum Empfangen von Benachrichtigungen von einer TrackLocation Objekt durch Aufrufen seiner IObservable<T>.Subscribe -Methode, die einen Verweis auf das Objekt "Beobachter" um eine private generische weist List<T> Objekt. Die Methode gibt ein Unsubscriber Objekt, das eine IDisposable Implementierung, die Beobachter den Empfang von Benachrichtigungen beenden kann. Die LocationTracker -Klasse enthält zudem ein EndTransmission Methode. Wenn keine weiteren Daten für den Speicherort verfügbar ist, ruft die Methode jedes Beobachters OnCompleted Methode und löscht dann die interne Liste der Beobachter.

Dann instanziiert der folgende Code den Anbieter und den Beobachter.

using System;

class Program
{
   static void Main(string[] args)
   {
      // Define a provider and two observers.
      LocationTracker provider = new LocationTracker();
      LocationReporter reporter1 = new LocationReporter("FixedGPS");
      reporter1.Subscribe(provider);
      LocationReporter reporter2 = new LocationReporter("MobileGPS");
      reporter2.Subscribe(provider);

      provider.TrackLocation(new Location(47.6456, -122.1312));
      reporter1.Unsubscribe();
      provider.TrackLocation(new Location(47.6677, -122.1199));
      provider.TrackLocation(null);
      provider.EndTransmission();
   }
}
// The example displays output similar to the following:
//      FixedGPS: The current location is 47.6456, -122.1312
//      MobileGPS: The current location is 47.6456, -122.1312
//      MobileGPS: The current location is 47.6677, -122.1199
//      MobileGPS: The location cannot be determined.
//      The Location Tracker has completed transmitting data to MobileGPS.

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 4.0
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: