이 그렇게해야
public static IObservable<T> ThrottleTime<T>(this IObservable<T> source, TimeSpan ts)
{
return ThrottleTime(source, ts, Scheduler.Default);
}
public static IObservable<T> ThrottleTime<T>(this IObservable<T> source, TimeSpan ts, IScheduler scheduler)
{
return source
.Timestamp(scheduler)
.Scan((EmitValue: false, OpenTime: DateTimeOffset.MinValue, Item: default(T)), (state, item) => item.Timestamp > state.OpenTime
? (true, item.Timestamp + ts, item.Value)
: (false, state.OpenTime, item.Value)
)
.Where(t => t.EmitValue)
.Select(t => t.Item);
}
설명 : ThrottleTime
생각 단일 상태 변수를 갖는 같이 게이트 새로운 값 열리는 다음번. 원본 항목이이 시간 초과 값보다 앞에 있으면 아무 일도 일어나지 않습니다. 원본 항목이 그 이후에있는 경우 통과시킨 다음 게이트 값을 최신 타임 스탬프로 다시 설정합니다.
Scan
은 튜플의 시간 값 (OpenTime
변수)을 유지합니다. 터플의 다른 필드는 더 많은 다운 스트림에 도움이됩니다.