私は
BufferWithTime
があなたの後になっていると思います。
そこに組み込まれて何もありませんが、このような何かが動作するはずです:
注:エラーソースから発生した場合、バッファがフラッシュされません。これは、あなただけのユーザーが一定時間入力して停止したときの動作を実行する必要があり、必ずしも中間を必要としない場合BufferWith*
public static IObservable<TSource[]> BufferWithTimeout<TSource>(
this IObservable<TSource> source, TimeSpan timeout)
{
return source.BufferWithTimeout(timeout, Scheduler.TaskPool);
}
public static IObservable<TSource[]> BufferWithTimeout<TSource>(
this IObservable<TSource> source, TimeSpan timeout, IScheduler scheduler)
{
return Observable.CreateWithDisposable<TSource[]>(observer =>
{
object lockObject = new object();
List<TSource> buffer = new List<TSource>();
MutableDisposable timeoutDisposable = new MutableDisposable();
Action flushBuffer =() =>
{
TSource[] values;
lock(lockObject)
{
values = buffer.ToArray();
buffer.Clear();
}
observer.OnNext(values);
};
var sourceSubscription = source.Subscribe(
value =>
{
lock(lockObject)
{
buffer.Add(value);
}
timeoutDisposable.Disposable =
scheduler.Schedule(flushBuffer, timeout);
},
observer.OnError,
() =>
{
flushBuffer();
observer.OnCompleted();
});
return new CompositeDisposable(sourceSubscription, timeoutDisposable);
});
}
BufferWithTimeは定期的にトリガをトリガしますが、特定のアイドル時間が経過した後にトリガしたいと考えています。 –
これは、ギャップがない場合、決して出力を受け取らないことを意味しますか? –
はい、ギャップがない場合は、イベントを受信したくありません。しかし、イベントはユーザーのキー入力によって生成され、タイムアウトは100msですので、遅かれ早かれギャップがあります:) –