Observable.Buffer<TSource,> méthode (IObservable<TSource>, TimeSpan, TimeSpan, IScheduler)
Indique chaque élément d’une séquence observable en zéro ou plusieurs mémoires tampons produites en fonction des informations de minutage.
Namespace:System.Reactive.Linq
Assemblée: System.Reactive (en System.Reactive.dll)
Syntaxe
'Declaration
<ExtensionAttribute> _
Public Shared Function Buffer(Of TSource) ( _
source As IObservable(Of TSource), _
timeSpan As TimeSpan, _
timeShift As TimeSpan, _
scheduler As IScheduler _
) As IObservable(Of IList(Of TSource))
'Usage
Dim source As IObservable(Of TSource)
Dim timeSpan As TimeSpan
Dim timeShift As TimeSpan
Dim scheduler As IScheduler
Dim returnValue As IObservable(Of IList(Of TSource))
returnValue = source.Buffer(timeSpan, _
timeShift, scheduler)
public static IObservable<IList<TSource>> Buffer<TSource>(
this IObservable<TSource> source,
TimeSpan timeSpan,
TimeSpan timeShift,
IScheduler scheduler
)
[ExtensionAttribute]
public:
generic<typename TSource>
static IObservable<IList<TSource>^>^ Buffer(
IObservable<TSource>^ source,
TimeSpan timeSpan,
TimeSpan timeShift,
IScheduler^ scheduler
)
static member Buffer :
source:IObservable<'TSource> *
timeSpan:TimeSpan *
timeShift:TimeSpan *
scheduler:IScheduler -> IObservable<IList<'TSource>>
JScript does not support generic types and methods.
Paramètres de type
- TSource
Type de la source.
Paramètres
- source
Type : System.IObservable<TSource>
Séquence source sur laquelle produire des mémoires tampons.
- timeSpan
Type : System.TimeSpan
Longueur de chaque mémoire tampon.
- Timeshift
Type : System.TimeSpan
Intervalle entre la création de mémoires tampons consécutives.
- scheduler
Type : System.Reactive.Concurrency.IScheduler
Planificateur sur lequel exécuter les minuteurs de mise en mémoire tampon.
Valeur de retour
Type : System.IObservable<IList<TSource>>
Séquence observable mise en mémoire tampon.
Remarque sur l'utilisation
Dans Visual Basic et C#, vous pouvez appeler cette méthode en tant que méthode instance sur n’importe quel objet de type IObservable<TSource>. Lorsque vous utilisez la syntaxe des méthodes d'instance pour appeler cette méthode, omettez le premier paramètre. Pour plus d'informations, consultez ou .
Notes
Cet opérateur crée une mémoire tampon qui contiendra tous les éléments qui se produisent pendant la durée du paramètre timeSpan. Cela permet à une application de mettre en mémoire tampon des éléments à livrer par lots. Le paramètre timeShift indique la fréquence à laquelle les gestionnaires d’abonnement doivent être exécutés pour les éléments dans la mémoire tampon, ce qui entraîne l’envoi (push) des éléments aux abonnés. Le paramètre du planificateur contrôle le thread sur lequel les minuteurs de la mémoire tampon seront créés.
Exemples
L’exemple de code génère une séquence infinie d’e-mails à partir d’un IEnumerable qui génère de façon aléatoire un e-mail en trois secondes. Les e-mails sont horodatés à l’aide de l’opérateur IObservable.TimeStamp. Ensuite, ils sont mis en mémoire tampon dans une mémoire tampon qui contient tous les e-mails qui se produisent dans un intervalle de temps de dix secondes. Un abonnement à la séquence mise en mémoire tampon est créé. Enfin, chaque groupe d’e-mails est ensuite écrit dans la fenêtre de console avec l’horodatage correspondant généré pour l’e-mail.
using System;
using System.Collections.Generic;
using System.Threading;
using System.Reactive.Linq;
using System.Reactive;
namespace Example
{
class Program
{
static void Main()
{
//************************************************************************************************************************//
//*** By generating an observable sequence from the enumerator, we can use Rx to push the emails to an email buffer ***//
//*** and have the buffer dumped at an interval we choose. This simulates how often email is checked for new messages. ***//
//************************************************************************************************************************//
IObservable<string> myInbox = EndlessBarrageOfEmails().ToObservable();
//************************************************************************************************************************//
//*** We can use the Timestamp operator to additionally timestamp each email in the sequence when it is received. ***//
//************************************************************************************************************************//
IObservable<Timestamped<string>> myInboxTimestamped = myInbox.Timestamp();
//******************************************************************************************************************************//
//*** The timer controls the frequency of emails delivered from the email buffer. This timer will be on another thread since ***//
//*** the main thread will be blocked waiting on a key press. ***//
//******************************************************************************************************************************//
System.Reactive.Concurrency.IScheduler scheduleOnNewThread = System.Reactive.Concurrency.Scheduler.NewThread;
//***************************************************************************************************************************//
//*** Create a buffer with Rx that will hold all emails received within 10 secs and execute subscription handlers for the ***//
//*** buffer every 10 secs. ***//
//*** Schedule the timers associated with emptying the buffer to be created on the new thread. ***//
//***************************************************************************************************************************//
IObservable<IList<Timestamped<string>>> newMail = myInboxTimestamped.Buffer(TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10),
scheduleOnNewThread);
//******************************************************//
//*** Activate the subscription on a separate thread ***//
//******************************************************//
IDisposable handle = newMail.SubscribeOn(scheduleOnNewThread).Subscribe(emailList =>
{
Console.WriteLine("\nYou've got mail! {0} messages.\n", emailList.Count);
foreach (Timestamped<string> email in emailList)
{
Console.WriteLine("Message : {0}\nTimestamp : {1}\n", email.Value, email.Timestamp.ToString());
}
});
Console.ReadLine();
handle.Dispose();
}
//*********************************************************************************************//
//*** ***//
//*** This method will continually yield a random email at a random interval within 3 sec. ***//
//*** ***//
//*********************************************************************************************//
static IEnumerable<string> EndlessBarrageOfEmails()
{
Random random = new Random();
//***************************************************************//
//*** For this example we are using this fixed list of emails ***//
//***************************************************************//
List<string> emails = new List<string> { "Email Msg from John ",
"Email Msg from Bill ",
"Email Msg from Marcy ",
"Email Msg from Wes "};
//***********************************************************************************//
//*** Yield an email from the list continually at a random interval within 3 sec. ***//
//***********************************************************************************//
while (true)
{
yield return emails[random.Next(emails.Count)];
Thread.Sleep(random.Next(3000));
}
}
}
}
Voici un exemple de sortie de l’exemple de code.
You've got mail! 6 messages.
Message : Email Msg from John
Timestamp : 5/16/2011 3:45:09 PM -04:00
Message : Email Msg from Wes
Timestamp : 5/16/2011 3:45:12 PM -04:00
Message : Email Msg from Marcy
Timestamp : 5/16/2011 3:45:13 PM -04:00
Message : Email Msg from Bill
Timestamp : 5/16/2011 3:45:13 PM -04:00
Message : Email Msg from Marcy
Timestamp : 5/16/2011 3:45:13 PM -04:00
Message : Email Msg from Marcy
Timestamp : 5/16/2011 3:45:15 PM -04:00
You've got mail! 7 messages.
Message : Email Msg from Marcy
Timestamp : 5/16/2011 3:45:17 PM -04:00
Message : Email Msg from Bill
Timestamp : 5/16/2011 3:45:18 PM -04:00
Message : Email Msg from Wes
Timestamp : 5/16/2011 3:45:19 PM -04:00
Message : Email Msg from Bill
Timestamp : 5/16/2011 3:45:21 PM -04:00
Message : Email Msg from Bill
Timestamp : 5/16/2011 3:45:24 PM -04:00
Message : Email Msg from Bill
Timestamp : 5/16/2011 3:45:26 PM -04:00
Message : Email Msg from Marcy
Timestamp : 5/16/2011 3:45:26 PM -04:00