मुझे एक डब्ल्यूपीएफ यूआई बनाना है, जो वास्तविक समय एफएक्स दर (मुद्रा + दर) अपडेट के लिए सब्सक्राइबर है और उन्हें ग्रिड में प्रदर्शित करता है (लगभग 1000 अपडेट प्रति सेकंड, जिसका मतलब है कि ग्रिड में प्रत्येक पंक्ति मिल सकती है प्रति सेकंड 1000 बार अपडेट किया गया)। ग्रिड में किसी भी समय कम से कम 50 पंक्तियां होंगी।रीयलटाइम में यूआई अपडेट करना
इस के लिए, मैंने एक व्यूमोडेल बनाया है जो अद्यतन घटनाओं की सदस्यता लेता है, और उन अद्यतनों को एक समवर्ती शब्दकोश के अंदर संग्रहीत करता है, जो कि दरव्यूमोडेल ऑब्जेक्ट के रूप में प्रतीक और मूल्य के रूप में महत्वपूर्ण है। तब मेरे पास एक और अवलोकन संग्रह है जिसमें उन सभी रेटव्यूमोडल ऑब्जेक्ट्स हैं, और इसे ग्रिड से बांधें।
कोड:
public class MyViewModel
{
private readonly IRatesService ratesService;
private readonly ConcurrentDictionary<string, RateViewModel> rateDictionary;
private object _locker = new object();
public MyViewModel(IRatesService ratesService)
{
this.ratesService = ratesService;
this.ratesService.OnUpdate += OnUpdate;
rateDictionary = new ConcurrentDictionary<string, RateViewModel>();
RateViewModels = new ObservableCollection<RateViewModel>();
}
private void OnUpdate(object sender, RateUpdateEventArgs e)
{
RateViewModel exisistingRate;
if (!rateDictionary.TryGetValue(e.Update.Currency, out exisistingRate))
{
exisistingRate = new RateViewModel(new Rate(e.Update.Currency, e.Update.Rate));
rateDictionary.TryAdd(e.Update.Currency, exisistingRate);
return;
}
lock (_locker)
{
exisistingRate.UpdateRate(e.Update.Rate);
}
Application.Current.Dispatcher.BeginInvoke(new Action(() => SearchAndUpdate(exisistingRate)));
}
public ObservableCollection<RateViewModel> RateViewModels { get; set; }
private void SearchAndUpdate(RateViewModel rateViewModel)
{
//Equals is based on Currency
if (!RateViewModels.Contains(rateViewModel))
{
RateViewModels.Add(rateViewModel);
return;
}
var index = RateViewModels.IndexOf(rateViewModel);
RateViewModels[index] = rateViewModel;
}
}
मैं इस पर 4 प्रश्न हैं:,
वहाँ एक रास्ता मैं ObservableCollection को समाप्त कर सकते है के रूप में यह एक ही आइटम के भंडारण के 2 अलग datastructures के लिए अग्रणी रहा है - लेकिन अभी भी मेरे अपडेट यूआई को रिले किया गया है?
मैंने समवर्ती शब्दकोश का उपयोग किया है, जो पूरे अद्यतन ऑपरेशन को लॉक करने की ओर जाता है। क्या पूरे सिद्धांत को लॉक करने या किसी भी डेटास्ट्रक्चर के लिए इसे संभालने का कोई और चालाक तरीका है?
मेरा अपडेटरेट विधि भी ताले - मेरे रेटव्यूम मॉडल पर मेरी सभी संपत्तियां केवल कीमत को छोड़कर पढ़ी जाती हैं, क्योंकि यह अपडेट हो रही है। क्या इस परमाणु बनाने का कोई तरीका है, कृपया ध्यान दें कि कीमत एक डबल के रूप में आ रही है।
क्या कोई तरीका है कि मैं SearchAndUpdate विधि को अनुकूलित कर सकता हूं, यह 1 से संबंधित है। फिलहाल मुझे विश्वास है कि यह एक ओ (एन) ऑपरेशन है।
.NET 4.0 का उपयोग करना और संक्षिप्तता के लिए INPC नहीं दिखाए हैं।
* संपादित करें: * क्या आप कृपया सभी 4 अंकों को ध्यान में रखते हुए इसे बेहतर तरीके से लिखने में मेरी सहायता कर सकते हैं? Psuedocode करेंगे।
धन्यवाद, -माइक
क्या आप प्वाइंट 3 के लिए कुछ छद्म कोड पोस्ट कर सकते हैं? – Mike
मैं इस बारे में बहुत स्पष्ट नहीं हूं "इंटरलॉक का उपयोग करें। कॉम्पारे एक्सचेंज एक निजी फ़ील्ड को 1 पर सेट करने के लिए, यदि यह 1 से बाहर निकलता है तो अभी भी एक लंबित यूआई अपडेट है यदि इंटरलॉक.कंपारे एक्सचेंज 0 लौटा, यूआई पर आक्रमण करें और अपनी आग लगाएं संपत्ति ने ईवेंट बदल दिया और आपको थ्रॉटलिंग फ़ील्ड को 0 पर अपडेट किया (तकनीकी रूप से यदि आपको गैर x86 की परवाह है तो आपको और करने की आवश्यकता है) --- --- क्या आप कृपया एक संक्षिप्त कोड स्निपेट पोस्ट कर सकते हैं? – Mike
@ माइक मैंने तकनीक – Yaur