В дополнение к ответу Ричарда Сзалая я только что посмотрел на нового оператора Window
из последней версии rx.Это «своего рода» решает вашу проблему в том смысле, что вы можете «буферизовать с тайм-аутом», то есть получать выходные данные в течение времени, которое длится до истечения времени ожидания, но вместо того, чтобы получать результаты в виде IEnumerable, вы фактически получаете ихкак IObservable.
Вот краткий пример того, что я имею в виду:
private void SetupStream()
{
var inputStream = Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>(
h => new MouseButtonEventHandler(h),
h => MouseDown += h,
h => MouseDown -= h);
var timeout = inputStream.Select(evt => Observable.Timer(TimeSpan.FromSeconds(10), Scheduler.Dispatcher))
.Switch();
inputStream.Window(() => timeout)
.Subscribe(OnWindowOpen);
}
private void OnWindowOpen(IObservable<IEvent<MouseButtonEventArgs>> window)
{
Trace.WriteLine(string.Format("Window open"));
var buffer = new List<IEvent<MouseButtonEventArgs>>();
window.Subscribe(click =>
{
Trace.WriteLine(string.Format("Click"));
buffer.Add(click);
}, () => ProcessEvents(buffer));
}
private void ProcessEvents(IEnumerable<IEvent<MouseButtonEventArgs>> clicks)
{
Trace.WriteLine(string.Format("Window closed"));
//...
}
Каждый раз, когда открывается окно, вы получаете все события по мере их поступления, сохраняете их в буфере и обрабатываете, когдаокно завершается (что на самом деле происходит, когда открывается следующее окно).
Не уверен, что Ричард изменит свой пример, чтобы использовать Window
, теперь он доступен, но подумал, что в качестве альтернативы его стоит поднять.