.NET 4.6 का उपयोग कर मेरे डब्ल्यूपीएफ एप्लिकेशन में मेरे पास एक ऐसा ईवेंट है जो उच्च दर (कई सौ प्रति सेकेंड) पर नए डेटा पॉइंट चलाता है, लेकिन हर समय नहीं। यह डेटा एक चार्ट में प्रदर्शित होता है।आरएक्स बफर ग्राहक को खाली कॉल के बिना
मैं प्रत्येक 50 एमएस चार्ट को अपडेट करना चाहता हूं और प्रत्येक नए डेटा बिंदु के बाद नहीं।
यह प्राप्त करने के लिए कि मैं आरएक्स से Buffer(TimeSpan.FromMilliseconds(50))
का उपयोग करने के बावजूद, सिद्धांत में ठीक काम करता है। लेकिन मेरे ग्राहक को हर 50 एमएस भी कहा जाता है यदि कोई नया डेटा पॉइंट नहीं बनाया गया है जो कि मैं बिल्कुल नहीं चाहता हूं।
मुझे लगता है कि बाहर का परीक्षण करने के लिए एक छोटे नमूना आवेदन बनाया: https://dotnetfiddle.net/TV5tD4
वहाँ:
using System;
using System.Reactive.Linq;
namespace RxTester
{
public class Program
{
private static event EventHandler TheEvent;
static void Main(string[] args)
{
var observable = Observable.FromEvent<EventHandler, EventArgs>(h => (s, e) => h(e), h => TheEvent += h, h => TheEvent -= h);
var subscriber = observable.Buffer(TimeSpan.FromMilliseconds(1000))
.Subscribe(e => Console.WriteLine($"{DateTime.Now.ToLongTimeString()}: {e.Count} elements received..."));
var random = new Random();
var timer = new System.Timers.Timer(2000)
{
AutoReset = true,
Enabled = true
};
timer.Elapsed += (s, e) =>
{
var amount = random.Next(1, 10);
for (int i = 0; i < amount; ++i)
TheEvent?.Invoke(null, null);
};
Console.ReadLine();
timer.Enabled = false;
subscriber.Dispose();
}
}
}
इसे चलाने के लिए करने के लिए या का उपयोग निम्नलिखित फिडल आप "आरएक्स-Linq" NuGet पैकेज जोड़ने की जरूरत आप कई "0 तत्व प्राप्त हुए" देखते हैं जो मैं टालना चाहता हूं। मुझे पता है कि मैं e.Count == 0
के लिए सरल जांच कर सकता हूं, लेकिन जैसे ही मैं ऐसे बफरों का उपयोग करता हूं, यह मेरे लिए अनुकूल नहीं लगता है।
तत्व उपलब्ध होने पर केवल तत्व के नए buffered ब्लॉक बनाने का कोई तरीका है?
मैं समय-समय पर बैचिंग घटनाओं की अपनी समस्या को हल करने के लिए अन्य दृष्टिकोणों के लिए भी खुला हूं - मैंने पहले ही टीपीएल डेटाफ्लो BatchBlock
में देखा है, लेकिन ऐसा लगता है कि केवल गिनती आधारित ब्लॉक आकारों का समर्थन करता है।
इसके लिए धन्यवाद - ठीक काम करने लगता है। लेकिन 'रिटर्न स्रोत। ग्रुपब्युट (_ => सत्य, _ => अवलोकन करने योग्य टिमर (थ्रेसहोल्ड))। चुनें मैनी (जी => जी। टॉलिस्ट()); 'यह भी ठीक काम करता प्रतीत होता है -' पर्यवेक्षित। इसके चारों ओर बनाओ? इस मामले में – ChrFin
@ChrFin कोई फायदा नहीं है। मैं जवाब संपादित करूँगा :) – supertopi
... और यदि आप इसके बारे में सोचते हैं तो 'Observable.FromEvent' हमेशा गर्म होता है। तो 'प्रकाशित' भी छोड़ा जा सकता है। – supertopi