Questa pagina è stata utile?
I suggerimenti relativi al contenuto di questa pagina sono importanti. Comunicaceli.
Altri suggerimenti?
1500 caratteri rimanenti
Esporta (0) Stampa
Espandi tutto
Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

Interfaccia IObservable<T>

Definisce un provider per la notifica basata su push.

Spazio dei nomi:  System
Assembly:  mscorlib (in mscorlib.dll)

public interface IObservable<out T>

Parametri di tipo

out T

Oggetto che fornisce informazioni di notifica.

Il parametro di questo tipo è covariante. Ciò significa che è possibile utilizzare il tipo specificato o qualsiasi tipo più derivato. Per ulteriori informazioni sulla covarianza e la controvarianza, vedere Covarianza e controvarianza nei generics.

Il tipo IObservable<T> espone i seguenti membri.

  NomeDescrizione
Metodo pubblicoSupportato da Libreria di classi portabileSupportato in .NET per applicazioni Windows StoreSubscribeNotifica al provider che un osservatore deve ricevere le notifiche.
In alto

  NomeDescrizione
Metodo di estensione pubblicoAggregate<TSource>(Func<TSource, TSource, TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoAggregate<TSource, TAccumulate>(TAccumulate, Func<TAccumulate, TSource, TAccumulate>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoAll<TSource> (Definito da Observable).
Metodo di estensione pubblicoAmb<TSource> (Definito da Observable).
Metodo di estensione pubblicoAnd<TLeft, TRight> (Definito da Observable).
Metodo di estensione pubblicoAny<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoAny<TSource>(Func<TSource, Boolean>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoAsObservable<TSource> (Definito da Observable).
Metodo di estensione pubblicoBufferWithCount<TSource>(Int32)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoBufferWithCount<TSource>(Int32, Int32)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoBufferWithTime<TSource>(TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoBufferWithTime<TSource>(TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoBufferWithTime<TSource>(TimeSpan, TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoBufferWithTime<TSource>(TimeSpan, TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoBufferWithTimeOrCount<TSource>(TimeSpan, Int32)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoBufferWithTimeOrCount<TSource>(TimeSpan, Int32, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoCatch<TSource>(IObservable<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoCatch<TSource, TException>(Func<TException, IObservable<TSource>>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoCombineLatest<TLeft, TRight, TResult> (Definito da Observable).
Metodo di estensione pubblicoConcat<TSource> (Definito da Observable).
Metodo di estensione pubblicoContains<TSource>(TSource)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoContains<TSource>(TSource, IEqualityComparer<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoCount<TSource> (Definito da Observable).
Metodo di estensione pubblicoDelay<TSource>(DateTimeOffset)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDelay<TSource>(TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDelay<TSource>(DateTimeOffset, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDelay<TSource>(TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDistinctUntilChanged<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDistinctUntilChanged<TSource>(IEqualityComparer<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDistinctUntilChanged<TSource, TKey>(Func<TSource, TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDistinctUntilChanged<TSource, TKey>(Func<TSource, TKey>, IEqualityComparer<TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDo<TSource>(Action<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDo<TSource>(IObserver<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDo<TSource>(Action<TSource>, Action)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDo<TSource>(Action<TSource>, Action<Exception>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoDo<TSource>(Action<TSource>, Action<Exception>, Action)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoFinally<TSource> (Definito da Observable).
Metodo di estensione pubblicoFirst<TSource> (Definito da Observable).
Metodo di estensione pubblicoFirstOrDefault<TSource> (Definito da Observable).
Metodo di estensione pubblicoForkJoin<TLeft, TRight, TResult> (Definito da Observable).
Metodo di estensione pubblicoGetEnumerator<TSource> (Definito da Observable).
Metodo di estensione pubblicoGroupBy<TSource, TKey>(Func<TSource, TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoGroupBy<TSource, TKey>(Func<TSource, TKey>, IEqualityComparer<TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoGroupBy<TSource, TKey, TElement>(Func<TSource, TKey>, Func<TSource, TElement>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoGroupBy<TSource, TKey, TElement>(Func<TSource, TKey>, Func<TSource, TElement>, IEqualityComparer<TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoIsEmpty<TSource> (Definito da Observable).
Metodo di estensione pubblicoLast<TSource> (Definito da Observable).
Metodo di estensione pubblicoLastOrDefault<TSource> (Definito da Observable).
Metodo di estensione pubblicoLatest<TSource> (Definito da Observable).
Metodo di estensione pubblicoLet<TSource, TResult> (Definito da Observable).
Metodo di estensione pubblicoLongCount<TSource> (Definito da Observable).
Metodo di estensione pubblicoMaterialize<TSource> (Definito da Observable).
Metodo di estensione pubblicoMax<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMax<TSource>(IComparer<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMaxBy<TSource, TKey>(Func<TSource, TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMaxBy<TSource, TKey>(Func<TSource, TKey>, IComparer<TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMerge<TSource>(IObservable<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMerge<TSource>(IObservable<TSource>, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMin<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMin<TSource>(IComparer<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMinBy<TSource, TKey>(Func<TSource, TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMinBy<TSource, TKey>(Func<TSource, TKey>, IComparer<TKey>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoMostRecent<TSource> (Definito da Observable).
Metodo di estensione pubblicoNext<TSource> (Definito da Observable).
Metodo di estensione pubblicoObserveOn<TSource>(Dispatcher)Sottoposto a overload. (Definito da DispatcherObservableExtensions).
Metodo di estensione pubblicoObserveOn<TSource>(DispatcherScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoObserveOn<TSource>(IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoObserveOn<TSource>(SynchronizationContext)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoObserveOnDispatcher<TSource> (Definito da Observable).
Metodo di estensione pubblicoOnErrorResumeNext<TSource> (Definito da Observable).
Metodo di estensione pubblicoPrune<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPrune<TSource>(IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPrune<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPrune<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPublish<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPublish<TSource>(TSource)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPublish<TSource>(TSource, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPublish<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPublish<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, TSource)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoPublish<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, TSource, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRepeat<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRepeat<TSource>(Int32)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource>(Int32)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource>(IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource>(TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource>(Int32, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource>(Int32, TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource>(TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource>(Int32, TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, Int32)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, Int32, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, Int32, TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoReplay<TSource, TResult>(Func<IObservable<TSource>, IObservable<TResult>>, Int32, TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRetry<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRetry<TSource>(Int32)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRun<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRun<TSource>(Action<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRun<TSource>(IObserver<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRun<TSource>(Action<TSource>, Action)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRun<TSource>(Action<TSource>, Action<Exception>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoRun<TSource>(Action<TSource>, Action<Exception>, Action)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSample<TSource>(TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSample<TSource>(TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoScan<TSource>(Func<TSource, TSource, TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoScan<TSource, TAccumulate>(TAccumulate, Func<TAccumulate, TSource, TAccumulate>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoScan0<TSource, TAccumulate> (Definito da Observable).
Metodo di estensione pubblicoSelect<TSource, TResult>(Func<TSource, TResult>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSelect<TSource, TResult>(Func<TSource, Int32, TResult>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSelectMany<TSource, TResult>(Func<TSource, IObservable<TResult>>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSelectMany<TSource, TResult>(Func<TSource, IEnumerable<TResult>>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSelectMany<TSource, TOther>(IObservable<TOther>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSelectMany<TSource, TResult>(Func<TSource, IObservable<TResult>>, Func<Exception, IObservable<TResult>>, Func<IObservable<TResult>>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSelectMany<TSource, TCollection, TResult>(Func<TSource, IObservable<TCollection>>, Func<TSource, TCollection, TResult>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSingle<TSource> (Definito da Observable).
Metodo di estensione pubblicoSingleOrDefault<TSource> (Definito da Observable).
Metodo di estensione pubblicoSkip<TSource> (Definito da Observable).
Metodo di estensione pubblicoSkipLast<TSource> (Definito da Observable).
Metodo di estensione pubblicoSkipUntil<TSource, TOther> (Definito da Observable).
Metodo di estensione pubblicoSkipWhile<TSource> (Definito da Observable).
Metodo di estensione pubblicoStartWith<TSource>(TSource[])Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoStartWith<TSource>(IScheduler, TSource[])Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSubscribe<TSource>()Sottoposto a overload. (Definito da ObservableExtensions).
Metodo di estensione pubblicoSubscribe<TSource>(Action<TSource>)Sottoposto a overload. (Definito da ObservableExtensions).
Metodo di estensione pubblicoSubscribe<TSource>(Action<TSource>, Action<Exception>)Sottoposto a overload. (Definito da ObservableExtensions).
Metodo di estensione pubblicoSubscribe<TSource>(Action<TSource>, Action)Sottoposto a overload. (Definito da ObservableExtensions).
Metodo di estensione pubblicoSubscribe<TSource>(Action<TSource>, Action<Exception>, Action)Sottoposto a overload. (Definito da ObservableExtensions).
Metodo di estensione pubblicoSubscribeOn<TSource>(Dispatcher)Sottoposto a overload. (Definito da DispatcherObservableExtensions).
Metodo di estensione pubblicoSubscribeOn<TSource>(DispatcherScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSubscribeOn<TSource>(IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSubscribeOn<TSource>(SynchronizationContext)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSubscribeOnDispatcher<TSource> (Definito da Observable).
Metodo di estensione pubblicoSynchronize<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoSynchronize<TSource>(Object)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTake<TSource>(Int32)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTake<TSource>(Int32, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTakeLast<TSource> (Definito da Observable).
Metodo di estensione pubblicoTakeUntil<TSource, TOther> (Definito da Observable).
Metodo di estensione pubblicoTakeWhile<TSource> (Definito da Observable).
Metodo di estensione pubblicoThen<TSource, TResult> (Definito da Observable).
Metodo di estensione pubblicoThrottle<TSource>(TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoThrottle<TSource>(TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeInterval<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeInterval<TSource>(IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeout<TSource>(DateTimeOffset)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeout<TSource>(TimeSpan)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeout<TSource>(DateTimeOffset, IObservable<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeout<TSource>(DateTimeOffset, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeout<TSource>(TimeSpan, IObservable<TSource>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeout<TSource>(TimeSpan, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeout<TSource>(DateTimeOffset, IObservable<TSource>, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimeout<TSource>(TimeSpan, IObservable<TSource>, IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimestamp<TSource>()Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoTimestamp<TSource>(IScheduler)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoToEnumerable<TSource> (Definito da Observable).
Metodo di estensione pubblicoWhere<TSource>(Func<TSource, Boolean>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoWhere<TSource>(Func<TSource, Int32, Boolean>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoZip<TLeft, TRight, TResult>(IEnumerable<TRight>, Func<TLeft, TRight, TResult>)Sottoposto a overload. (Definito da Observable).
Metodo di estensione pubblicoZip<TLeft, TRight, TResult>(IObservable<TRight>, Func<TLeft, TRight, TResult>)Sottoposto a overload. (Definito da Observable).
In alto

IObserver<T> e IObservable<T> le interfacce forniscono un meccanismo generalizzato per la notifica basata su push, anche noto come modello di progettazione osservatore. L'interfaccia IObservable<T> rappresenta la classe che invia le notifiche (il provider); l'interfaccia IObserver<T> rappresenta la classe che li ricevi (l'observer). T rappresenta la classe che fornisce informazioni di notifica. In alcune notifiche basate su push, l'implementazione IObserver<T> e T può rappresentare lo stesso tipo.

Il provider deve implementare un singolo metodo, Subscribe, che indica che un osservatore desidera ricevere le notifiche basate su push. I chiamanti al metodo passare un'istanza osservatore. il metodo restituisce IDisposable implementazione di che consente agli osservatori per annullare le notifiche in qualsiasi momento prima che il provider sia stato interrotto inviarli.

In un determinato momento, un provider può contenere zero, uno, o più osservatori. Il provider è responsabile dell'archiviare i riferimenti agli osservatori e accertarsi che sono validi prima di inviare notifiche. IObservable<T> l'interfaccia non fare supposizioni sul numero degli osservatori o l'ordine in cui le notifiche inviate.

Il provider invia i seguenti tre tipi di notifiche all'osservatore chiamando i metodi di IObserver<T>:

  • I dati correnti. Il provider può chiamare il metodo IObserver<T>.OnNext metodo per passare all'osservatore un oggetto T contenente i dati correnti, i dati modificati, o quelli nuovi.

  • Una condizione di errore. Il provider può chiamare il metodo IObserver<T>.OnError per informare l'osservatore che si è verificata una determinata condizione di errore.

  • Nessun altro dato. il provider può chiamare il metodo IObserver<T>.OnCompleted per informare l'osservatore che ha completato l'invio di notifiche.

Nell'esempio seguente viene illustrato il pattern observer. Definisce una classe Location che contiene informazioni di latitudine e longitudine.


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


La classe LocationTracker fornisce l'implementazione di IObservable<T>. Il suo metodo TrackLocation riceve un oggetto nullable di tipo Location contenente i dati di latitudine e longitudine. Se il valore di Location non è null, il metodo TrackLocation chiama il metodo OnNext metodo di ogni osservatore.


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


Se il valore di Location è null, il metodo TrackLocation crea un'istanza di un oggetto LocationNotFoundException oggetto, che è mostrato nel seguente esempio. Chiama quindi ogni osservatore OnError metodo e passa LocationNotFoundException oggetto. si noti che LocationNotFoundException deriva da Exception, ma non aggiunge nuovi membri.


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


Log degli osservatori per ricevere le notifiche da un oggetto TrackLocation oggetto chiamando relativo IObservable<T>.Subscribe metodo, che assegna un riferimento a un osservatore a un oggetto privato List<T> oggetto. il metodo restituisce Unsubscriber oggetto, ovvero IDisposable implementazione di che consente agli osservatori di interrompere la ricezione delle notifiche. LocationTracker la classe include inoltre EndTransmission metodo. Quando non esistono ulteriori dati di posizionamento disponibili, le chiamate al metodo di ogni osservatore OnCompleted il metodo e quindi cancella l'elenco interno degli osservatori.

in questo esempio, LocationReporter la classe fornisce IObserver<T> implementazione. Visualizzare informazioni sulla posizione corrente nella console. Il costruttore include un oggetto name parametro, che consente LocationReporter istanza di per identificarsi nel relativo output della stringa. Include inoltre un oggetto Subscribe metodo, che esegue il wrapping di una chiamata al provider Subscribe metodo. In questo modo il metodo considerazione restituito IDisposable riferimento a una variabile privata. LocationReporter la classe include inoltre Unsubscribe metodo, che chiama IDisposable.Dispose metodo dell'oggetto restituito da IObservable<T>.Subscribe metodo. Il codice seguente definisce LocationReporter classe.


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


Il seguente codice viene quindi creata un'istanza del provider e l'osservatore.


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.


.NET Framework

Supportato in: 4.5.2, 4.5.1, 4.5, 4

.NET Framework Client Profile

Supportato in: 4

Libreria di classi portabile

Supportato in: Libreria di classi portabile

.NET per applicazioni Windows Store

Supportato in: Windows 8

.NET per applicazioni Windows Phone

Supportato in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

Aggiunte alla community

AGGIUNGI
Mostra:
© 2015 Microsoft