2012-01-13 4 views
7

Dato un IObservable<T> c'è un modo per utilizzare Throttle comportamento (azzerare un timer quando si aggiunge un elemento, ma lo hanno restituire un insieme di tutti gli elementi aggiunti all'interno di quel tempo?reattiva Throttle Tornando tutti gli articoli inseriti da meno il periodo che hai

Buffer fornisce una funzionalità simile è che bei pezzi i dati su in IList<T> su ogni intervallo di tempo o contare. Ma ho bisogno che il tempo per reimpostare ogni volta che viene aggiunto un elemento.

ho visto una domanda simile qui, Does reactive extensions support rolling buffers?, ma le risposte non sembrano ideali ed è un po 'vecchio quindi mi sono chiesto se la versione di Rx-Main ora supporta questo funzionalità fuori dagli schemi.

+0

Sembra che la mia risposta 'BufferWithInactivity' in http://stackoverflow.com/a/7604825/259769 è quello che stai chiedendo. Puoi chiarire la tua domanda per favore? – Enigmativity

+0

@Enigmativity È, è esattamente la funzionalità che sto cercando. Ho fatto riferimento a questa domanda nella mia domanda :) Ma non mi piace quella risposta, il rispondente ha dichiarato esplicitamente che è in corso un lavoro. – RichK

+0

Non sei sicuro di cosa stai chiedendo. Se il timer viene reimpostato ogni volta che un elemento viene "aggiunto" (propagato?) Come ci sarà qualcosa da tamponare in primo luogo? – Asti

risposta

7

Come I answered in the other post, sì, è possibile! Utilizzando le Throttle e Window metodi di Observable:

public static IObservable<IList<T>> BufferUntilInactive<T>(this IObservable<T> stream, TimeSpan delay) 
{ 
    var closes = stream.Throttle(delay); 
    return stream.Window(() => closes).SelectMany(window => window.ToList()); 
} 
+0

Bella risposta! Ma non si dovrebbe pubblicare lo stream usando 'return stream.Publish (hot => ...'), per evitare di iscriversi due volte a osservabili freddi? – Ziriax

Problemi correlati