İngilizce dilinde oku

Aracılığıyla paylaş


IObserver<T> Arabirim

Tanım

Anında iletme tabanlı bildirimleri almak için bir mekanizma sağlar.

C#
public interface IObserver<in T>

Tür Parametreleri

T

Bildirim bilgilerini sağlayan nesne.

Bu genel tür parametresi kontravaryanttır. Bu, kendi belirttiğiniz türü veya daha az türetilmiş başka bir türü kullanabileceğiniz anlamına gelir. Kovaryans ve kontravaryans hakkında daha fazla bilgi için bkz. Genel Türlerde Kovaryans ve Kontravaryans.
Türetilmiş

Örnekler

Aşağıdaki örnekte gözlemci tasarım deseni gösterilmektedir. Enlem ve boylam bilgilerini içeren bir Location sınıf tanımlar.

C#
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; } }
}

LocationReporter sınıfı uygulamayı sağlarIObserver<T>. Konsolun geçerli konumu hakkındaki bilgileri görüntüler. Oluşturucu, örneğin kendisini dize çıkışında tanımlamasını sağlayan LocationReporter bir name parametre içerir. Ayrıca sağlayıcının yöntemine yapılan çağrıyı Subscribe sarmalayan bir yöntemi de içerirSubscribe. Bu, yöntemin döndürülen IDisposable başvuruyu özel bir değişkene atamasını sağlar. sınıfı, LocationReporter yöntemi tarafından IObservable<T>.Subscribe döndürülen nesnesinin IDisposable.Dispose yöntemini çağıran bir Unsubscribe yöntem de içerir. Aşağıdaki kod sınıfını LocationReporter tanımlar.

C#
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();
   }
}

LocationTracker sınıfı uygulamayı sağlarIObservable<T>. TrackLocation Yöntemi, enlem ve boylam verilerini içeren null atanabilir Location bir nesne geçirilir. Location Değer değilsenull, TrackLocation yöntemi her gözlemcinin OnNext yöntemini çağırır.

C#
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();
   }
}

Location değeri ise null``TrackLocation yöntemi, aşağıdaki örnekte gösterilen bir LocationNotFoundException nesnenin örneğini oluşturur. Ardından her gözlemcinin OnError yöntemini çağırır ve nesnesine LocationNotFoundException geçirir. öğesinin türetildiğini LocationNotFoundException Exception ancak yeni üye eklemediğini unutmayın.

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

Gözlemciler, özel bir genel List<T> nesneye gözlemci nesnesine IObservable<T>.Subscribe başvuru atayan yöntemini çağırarak bir nesneden TrackLocation bildirim almak için kaydolmaktadır. yöntemi, gözlemcilerin bildirimleri almayı durdurmasını sağlayan bir uygulama olan bir IDisposable nesnesi döndürürUnsubscriber. sınıfı LocationTracker da bir EndTransmission yöntem içerir. Başka konum verisi olmadığında, yöntem her gözlemcinin OnCompleted yöntemini çağırır ve ardından iç gözlemci listesini temizler.

Ardından aşağıdaki kod sağlayıcıyı ve gözlemciyi oluşturur.

C#
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.

Açıklamalar

IObserver<T> ve IObservable<T> arabirimleri, gözlemci tasarım deseni olarak da bilinen, anında iletme tabanlı bildirim için genelleştirilmiş bir mekanizma sağlar. IObservable<T> Arabirim, bildirim gönderen sınıfı (sağlayıcı) temsil eder; IObserver<T> arabirim bunları alan sınıfı (gözlemci) temsil eder. T bildirim bilgilerini sağlayan sınıfı temsil eder.

Uygulama, IObserver<T> sağlayıcının yöntemine kendi IObservable<T>.Subscribe örneğini geçirerek bir sağlayıcıdan (uygulamaIObservable<T>) bildirim almayı düzenler. Bu yöntem, sağlayıcı bildirimleri göndermeyi bitirmeden önce gözlemcinin aboneliğini kaldırmak için kullanılabilecek bir IDisposable nesne döndürür.

Arabirimi, IObserver<T> gözlemcinin uygulaması gereken aşağıdaki üç yöntemi tanımlar:

  • Genellikle OnNext sağlayıcı tarafından gözlemciye yeni veri veya durum bilgileri sağlamak için çağrılan yöntem.

  • Genellikle OnError sağlayıcı tarafından verilerin kullanılamaz, erişilemez veya bozuk olduğunu ya da sağlayıcının başka bir hata koşuluyla karşılaştığını belirtmek için çağrılan yöntemi.

  • OnCompleted Genellikle sağlayıcı tarafından gözlemcilere bildirim gönderme işleminin tamamlandığını belirtmek için çağrılan yöntemi.

Yöntemler

OnCompleted()

Sağlayıcının anında iletme tabanlı bildirim göndermeyi bitirdiğini gözlemciye bildirir.

OnError(Exception)

Sağlayıcının bir hata durumuyla karşılaştığını gözlemciye bildirir.

OnNext(T)

Gözlemciye yeni veriler sağlar.

Şunlara uygulanır

Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Ayrıca bkz.