Partager via


BehaviorSubject<T>. Méthode Subscribe

Abonne un observateur à l’objet.

Namespace:System.Reactive.Subjects
Assemblée: System.Reactive (en System.Reactive.dll)

Syntaxe

'Declaration
Public Function Subscribe ( _
    observer As IObserver(Of T) _
) As IDisposable
'Usage
Dim instance As BehaviorSubject
Dim observer As IObserver(Of T)
Dim returnValue As IDisposable

returnValue = instance.Subscribe(observer)
public IDisposable Subscribe(
    IObserver<T> observer
)
public:
virtual IDisposable^ Subscribe(
    IObserver<T>^ observer
) sealed
abstract Subscribe : 
        observer:IObserver<'T> -> IDisposable 
override Subscribe : 
        observer:IObserver<'T> -> IDisposable 
public final function Subscribe(
    observer : IObserver<T>
) : IDisposable

Paramètres

Valeur de retour

Type : System.IDisposable
Objet IDisposable qui peut être utilisé pour désinscrire l’observateur de l’objet.

Implémente

IObservable<T>. Subscribe(IObserver<T>)

Notes

Un objet BehaviorSubject met en mémoire tampon le dernier élément qu’il a publié via son interface IObservable. Si aucun élément n’a été publié via son interface IObservable, l’élément initial fourni dans le constructeur est l’élément actuellement mis en mémoire tampon. Lorsqu’un abonnement est effectué à l’interface IObservable de BehaviorSubject, la séquence publiée commence par l’élément actuellement mis en mémoire tampon.

Aucun élément n’est mis en mémoire tampon ou publié à partir d’un objet BehaviorSubject une fois son interface IObserver terminée.

Exemples

Cet exemple illustre l’objet BehaviorSubject. L’exemple utilise l’opérateur Interval pour publier un entier dans une séquence d’entiers toutes les secondes. La séquence est terminée par l’opérateur Take après la publication de 10 entiers. Il s’agit de la séquence à laquelle l’objet BehaviorSubject s’abonne.

Deux abonnements sont créés pour l’interface IObservable de BehaviorSubject afin de montrer comment elle publie ses données.

  • Abonnement n°1 : cet abonnement commence au tout début et affiche la valeur initiale mise en mémoire tampon du constructeur (-9) dans la séquence.

  • Abonnement n°2 : cet abonnement démarre après une veille de 5 secondes. Cet abonnement montre que la séquence commence par l’élément actuellement mis en mémoire tampon.

using System;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Reactive.Concurrency;
using System.Threading;

namespace Example
{
  class Program
  {
    static void Main()
    {
      //********************************************************************************************************//
      //*** A subject acts similar to a proxy in that it acts as both a subscriber and a publisher           ***//
      //*** It's IObserver interface can be used to subscribe to multiple streams or sequences of data.      ***//
      //*** The data is then published through it's IObservable interface.                                   ***//
      //***                                                                                                  ***//
      //*** A BehaviorSubject buffers the last item it published through its IObservable interface. If no    ***//
      //*** item has been published through its IObservable interface then the initial item provided in the  ***//
      //*** constructor is the current buffered item. When a subscription is made to the BehaviorSubject's   ***//
      //*** IObservable interface, the sequence published begins with the currently buffered item.           ***//
      //***                                                                                                  ***//
      //*** No items are buffered or published from a BehaviorSubject once its IObserver interface receives  ***//
      //*** a completion.                                                                                    ***//
      //***                                                                                                  ***//
      //*** In this example, we use the Interval operator to publish an integer to a integer sequence every  ***//
      //*** second. The sequence will be completed by the Take operator after 10 integers are published.     ***//
      //*** This will be the sequence that the BehaviorSubject subscribes to.                                ***//
      //***                                                                                                  ***//
      //*** We will create 2 subscriptions to the BehaviorSubject's IObservable interface to show how it     ***//
      //*** publishes it's data.                                                                             ***//
      //***                                                                                                  ***//
      //*** Subscription #1 : This subscription will start at the very beginning and will show the initial   ***//
      //***                   buffered value from the constructor (-9) in the sequence.                      ***//
      //***                                                                                                  ***//
      //*** Subscription #2 : This subscription will start after a 5 sec. sleep showing the sequence starts  ***//
      //***                   with the currently buffered item.                                              ***//
      //********************************************************************************************************//

      BehaviorSubject<long> myBehaviorSubject = new BehaviorSubject<long>((-9));
      Observable.Interval(TimeSpan.FromSeconds(1), Scheduler.ThreadPool).Take(10).Subscribe(myBehaviorSubject);

      
      //********************************************************************************************************//
      //*** Subscription #1 : This subscription will start at the very beginning and will show the initial   ***//
      //***                   buffered value from the constructor (-9) in the sequence.                      ***//
      //********************************************************************************************************//

      EventWaitHandle wait1 = new EventWaitHandle(false, EventResetMode.ManualReset);
      myBehaviorSubject.Subscribe(x => Console.WriteLine("Subscription #1 observes : " + x),
                                  () => 
                                  {
                                    Console.WriteLine("Subscription #1 completed.");
                                    wait1.Set();
                                  });


      //********************************************************************************************************//
      //*** Subscription #2 : This subscription will start after a 5 sec. sleep showing the sequence starts  ***//
      //***                   with the currently buffered item.                                              ***//
      //********************************************************************************************************//
    
      Thread.Sleep(5000);
      EventWaitHandle wait2 = new EventWaitHandle(false, EventResetMode.ManualReset);
      myBehaviorSubject.Subscribe(x => Console.WriteLine("{0,30}Subscription #2 observes : {1}", " ", x), 
                                  () => 
                                  {
                                    Console.WriteLine("{0,30}Subscription #2 completed.", " ");
                                    wait2.Set();
                                  });


      //**************************************************//
      // *** Wait for completion on both subscriptions ***//
      //**************************************************//

      WaitHandle.WaitAll(new WaitHandle[] { wait1, wait2 });
      myBehaviorSubject.Dispose();

      Console.WriteLine("\nPress ENTER to exit...");
      Console.ReadLine();
    }
  }
}

La sortie suivante de l’exemple de code montre les abonnements qui se chevauchent.

Subscription #1 observes : -9
Subscription #1 observes : 0
Subscription #1 observes : 1
Subscription #1 observes : 2
Subscription #1 observes : 3
Subscription #1 observes : 4
                              Subscription #2 observes : 4
Subscription #1 observes : 5
                              Subscription #2 observes : 5
Subscription #1 observes : 6
                              Subscription #2 observes : 6
Subscription #1 observes : 7
                              Subscription #2 observes : 7
Subscription #1 observes : 8
                              Subscription #2 observes : 8
Subscription #1 observes : 9
                              Subscription #2 observes : 9
Subscription #1 completed.
                              Subscription #2 completed.

Press ENTER to exit...

Voir aussi

Référence

Classe T> BehaviorSubject<

Espace de noms System.Reactive.Subjects