2012-01-13 25 views
7

Với một IObservable<T> là có một cách để sử dụng Throttle hành vi (reset bộ đếm thời gian khi một mục được thêm vào, nhưng có nó trả về một bộ sưu tập của tất cả các mục được thêm vào trong thời gian đó?Reactive Throttle Trở All Items Added Trong Các TimeSpan

Buffer cung cấp một chức năng tương tự nó rằng nó khối dữ liệu lên IList<T> trên mỗi khoảng thời gian hoặc đếm. Nhưng tôi cần thời gian đó để thiết lập lại mỗi lần một mục được thêm vào.

tôi đã nhìn thấy một câu hỏi tương tự ở đây, Does reactive extensions support rolling buffers?, nhưng câu trả lời dường như không lý tưởng và nó hơi cũ nên tôi tự hỏi liệu phiên bản phát hành của Rx-Main có hỗ trợ điều này không chức năng ra khỏi hộp.

+0

Nghe có vẻ như 'BufferWithInactivity' câu trả lời của tôi trong http://stackoverflow.com/a/7604825/259769 là những gì bạn đang xin. Bạn có thể làm rõ câu hỏi của bạn được không? – Enigmativity

+0

@Enigmativity Đó là, nó chính xác là chức năng tôi đang theo đuổi. Tôi đã tham khảo câu hỏi đó trong câu hỏi của mình :) Nhưng tôi không thích câu trả lời đó, người trả lời đã tuyên bố rõ ràng rằng nó đang hoạt động. – RichK

+0

Không chắc bạn đang hỏi gì. Nếu bộ đếm thời gian được thiết lập lại mỗi khi một mục được "thêm" (tuyên truyền?) Làm thế nào sẽ có bất cứ điều gì để đệm ở nơi đầu tiên? – Asti

Trả lời

7

Như tôi answered in the other post, có bạn có thể! Sử dụng phương pháp ThrottleWindow của 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

Câu trả lời hay! Nhưng không nên xuất bản luồng bằng cách sử dụng 'return stream.Publish (hot => ...'), để tránh đăng ký hai lần với các quan sát lạnh? – Ziriax