C# (.NET 4.0) uygulamasında, olayları toplu değerlere ayırmak için zaman sınırları oluşturmak için Reaktif Uzantıları (2.0.20823.0) kullanın. Ortaya çıkan veri tabanındaki sorguları basitleştirmek için, bu sınırların tam saatte (veya aşağıdaki örnekte saniye olarak) hizalanması gerekir. Observable.Timer()
kullanmaObservable.Timer(): Zamanlayıcı sapmasından nasıl kaçınılır?
:
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")));
Sen amaçlanan ve zamanlayıcı gerçek zamanlı birbirinden oldukça ağır sürüklenip keneler olduğunu görebilirsiniz: Ben de bir HistoricalScheduler
ve tabii faydalanmak
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
...
Orada problemim yok. Hafif hataları tolere edebilirim ve sistem saati değişikliklerini önemsememe gerek yok. Gözlemciler tarafından tetiklenen ağır faaliyetler bulunmamaktadır. Ayrıca, blog post numaralı telefonun RX zaman ayarlı sürüklenme problemleri hakkında uzun bir tartışma olduğunu biliyorum, ancak kafamın etrafını saracak gibi görünmüyorum.
Ne periyodik sistematik zamanlayıcı savrulma olmaksızın bir Observable
planlamak için doğru yol olurdu?
Sorunumu çözmek için çok teşekkürler, mükemmel cevap ve yeterince doğru. Eğlenceli bir şekilde, bunu gözlemlemiştim çünkü 'Gözlemlenebilir.Generate()' bana [ilgili senaryoda] baş ağrıları veriyordu (http://stackoverflow.com/questions/13462713/why-does-observable-generate-throw- sistem StackOverflowException). RX kaynakları ile ilgili bir soru sorduğumda donanımımı iyi tanımak gibi görünüyor. –
Tamam, RX kaynaklarındaki yorumları işaretlediğiniz için teşekkürler. Onları daha sık kontrol etmem gerekiyor, şimdi mevcut. –