Trong ứng dụng C# (.NET 4.0), tôi sử dụng phần mở rộng phản ứng (2.0.20823.0) để tạo ra các ranh giới thời gian để nhóm các sự kiện thành các giá trị tổng hợp. Để đơn giản hóa các truy vấn đến cơ sở dữ liệu kết quả, các ranh giới này cần phải được căn chỉnh theo giờ đầy đủ (hoặc giây trong ví dụ bên dưới).Observable.Timer(): Làm thế nào để tránh trôi hẹn giờ?
Sử dụng Observable.Timer()
:
var time = DefaultScheduler.Instance;
var start = new DateTimeOffset(time.Now.DateTime, time.Now.Offset);
var span = TimeSpan.FromSeconds(1);
start -= TimeSpan.FromTicks(start.Ticks % 10000000);
start += span;
var boundary = Observable.Timer(start, span, time);
boundary.Select(i => start + TimeSpan.FromSeconds(i * span.TotalSeconds))
.Subscribe(t => Console.WriteLine("ideal: " + t.ToString("HH:mm:ss.fff")));
boundary.Select(i => time.Now)
.Subscribe(t => Console.WriteLine("actual: " + t.ToString("HH:mm:ss.fff")));
Bạn có thể thấy rằng các dự định và thời gian thực tế của bộ đếm thời gian ve trôi dạt ngoài khá nặng nề:
ideal: 10:06:40.000
actual: 10:06:40.034
actual: 10:06:41.048
ideal: 10:06:41.000
actual: 10:06:42.055
ideal: 10:06:42.000
ideal: 10:06:43.000
actual: 10:06:43.067
actual: 10:06:44.081
ideal: 10:06:44.000
ideal: 10:06:45.000
actual: 10:06:45.095
actual: 10:06:46.109
ideal: 10:06:46.000
ideal: 10:06:47.000
actual: 10:06:47.123
actual: 10:06:48.137
ideal: 10:06:48.000
...
Tôi cũng tận dụng một HistoricalScheduler
và tất nhiên Tôi không có vấn đề ở đó. Tôi có thể chịu đựng được những điểm không chính xác nhỏ và tôi không cần phải quan tâm đến những thay đổi của đồng hồ hệ thống. Không có hoạt động hạng nặng nào được kích hoạt bởi các Đài quan sát đó.
Ngoài ra, tôi biết có một cuộc thảo luận dài về vấn đề thời gian trôi dạt RX trong số blog post này, nhưng dường như tôi không thể quấn đầu xung quanh nó.
Điều gì sẽ là đúng cách để định kỳ lập lịch biểu Observable
mà không có sự cố định thời gian có hệ thống?
Cảm ơn rất nhiều, câu trả lời xuất sắc và đủ chính xác để giải quyết vấn đề của tôi. Ngạc nhiên thay, tôi đã loại trừ điều đó bởi vì 'Observable.Generate()' đã khiến tôi đau đầu trong một [kịch bản có liên quan] (http://stackoverflow.com/questions/13462713/why-does-observable-generate-throw- system-stackoverflowexception). Có vẻ như tôi biết phần cứng của tôi khá tốt mỗi khi tôi hỏi một câu hỏi liên quan đến RX :-) –
Ok, cảm ơn bạn đã chỉ ra các nhận xét trong các nguồn RX. Có vẻ như tôi nên kiểm tra chúng thường xuyên hơn, bây giờ chúng có sẵn. –