2015-01-19 10 views
7

मेरी WPF आवेदन में, मैं एक ईवेंट हैंडलर मेरी यूआई तत्व की mouseenter घटना पर कहा जाता है कि है:थ्रॉटल एक घटना हैंडलर

myUiElement.MouseEnter += myEventHandler 

मैं myEventHandler थ्रोटल चाहते हैं तो यह अधिक नहीं कहा जाता हो जाता है हर सेकेंड से एक बार। मैं यह कैसे कर सकता हूँ? क्या आरएक्स सिर्फ इसके लिए सबसे अच्छा दृष्टिकोण है? मैं .NET 4.0 का उपयोग कर रहा हूं यदि यह एक फर्क पड़ता है।

इसके अलावा, मुझे यह सुनिश्चित करने की ज़रूरत है कि माउसलीव ईवेंट हमेशा अगले माउसइंटर ईवेंट से पहले कॉल हो जाए; क्या मुझे इसे अपने आप प्रबंधित करने की ज़रूरत है? या पहले से ही ढांचा तैयार किया गया है ताकि माउसलेव घटनाओं को हमेशा अगले माउसइंटर घटना से पहले बुलाया जा सके? अगर मेरे पास इन ईवेंट हैंडलर में एसिंक्रोनस कोड है तो क्या होगा?

+1

क्या आपको वास्तव में इसे बिल्कुल नहीं बुलाया जाना चाहिए, या क्या आप अंतिम विधि के बहुत करीब थे अगर आप अपनी विधि में तत्काल वापसी कर सकते हैं? – siride

+0

मैं इसे थ्रॉटल करना चाहता था इसलिए उपयोगकर्ता थ्रेड को बोझ नहीं करता है अगर उपयोगकर्ता सबकुछ पर माउस को स्पैम करता है (मेरे पास कई यूआई तत्व हैं जो एक ही ईवेंट हैंडलर होंगे); लेकिन मुझे लगता है कि मैं ऐसा कर सकता हूं अगर यह वास्तव में थ्रॉटलिंग से अधिक कुशल है .. – Darius

+1

थ्रॉटलिंग का कोई भी तंत्र आखिरकार एक if-statement और निष्पादन जारी रखने या निरस्त करने का विकल्प शामिल करने जा रहा है। आप वास्तव में उस के आसपास नहीं मिल सकते हैं। – siride

उत्तर

6

आरएक्स का उपयोग करके, आप the Sample method या थ्रॉटल का उपयोग करना चाहते हैं।

कुछ इस तरह (untested) काम करना चाहिए:

Observable 
    .FromEventPattern<TextChangedEventArgs>(myUiElement, "MouseEnter"); 
    .Sample(TimeSpan.FromSeconds(1)); 
    .Subscribe(x=>...Do Stuff Here...); 

नमूना और थ्रॉटल के बीच अंतर यह है कि नमूना एक मूल्य के हर 1 सेकंड कोई बात नहीं ले जाएगा जब अंतिम मान लिया गया था, जबकि थ्रॉटल एक ले जाएगा मूल्य और फिर एक और लेने से पहले एक और 1 सेकंड प्रतीक्षा करें।

यह शायद एक और दृष्टिकोण के लिए एक निजी क्षेत्र का उपयोग "समय" जब पिछले माउस घटना हुई नज़र रखने के लिए, और केवल प्रसंस्करण जारी है कि होगा क्या आप के लिए ...

+0

"थ्रॉटल" के बजाय "नमूना" क्यों? – McGarnagle

+1

मैंने थ्रॉटल के लिए एक विवरण जोड़ा।शायद थ्रॉटल ओपी चाहता था, लेकिन अनुमान लगाने के बजाय मैंने सिर्फ विवरण दिया ताकि अंतिम उपयोगकर्ता अपना निर्णय ले सके –

6

आप प्रतिक्रियाशील एक्सटेंशन का उपयोग कर सकते हैं, लेकिन आप इसे टाइमर के साथ आसानी से पूरा कर सकते हैं।

टाइमर के साथ ध्वज सेट करें। जब टाइमर टिक घटना की आग लगती है, ध्वज को झूठा सेट करें, टाइमर को अक्षम करें, और अपने ईवेंट के लिए कोड चलाएं। फिर, अपने नियंत्रण ईवेंट हैंडलरों में, ध्वज सेट होने पर हैंडलर कोड छोड़ दिया गया है।

bool flag; 
DispatcherTimer timer; 

public constructor() 
{ 
    timer = new DispatcherTimer(); 
    timer.Interval = Timespan.FromSeconds(1); 
    timer.Tick += (s,e) => { 
     flag = false; 
     timer.Stop() 
     DoThrottledEvent(); 
    } 
} 

void mouse_enter(object sender, MouseEventArgs args) 
{ 
    if(!flag) 
    { 
     flag = true; 
     timer.Start(); 
    } 
} 

void DoThrottledEvent() 
{ 
    //code for event here 
} 

प्रतिक्रियाशील एक्सटेंशन अतिरिक्त निर्भरता पेश करते हैं, लेकिन वे थोड़ा मजेदार हैं। यदि आप रुचि रखते हैं, तो इसके लिए जाओ!

3

शूटिंग कर रहे हैं पर निर्भर करता है समय एक सेकंड पहले था।

DateTime _lastMouseEventTime = DateTime.UtcNow; 

void OnMouseEnter(object sender, MouseEventArgs e) 
{ 
    DateTime now = DateTime.UtcNow; 
    if (now.Subtract(_lastMouseEventTime).TotalSeconds >= 1) 
    { 
     // do stuff... 
    } 
    _lastMouseEventTime = now; 
} 

यह है कि "सामान" कम से कम एक दूसरा हो जाता अलग है, जो है मैं क्या सोचता आप के लिए पूछ रहे थे सुनिश्चित करता है।

+0

इसे किसी मोबाइल ऐप के लिए इस्तेमाल किया गया, बिना टाइमर और कुछ भी नहीं-लगातार फमिंग-। तैयार किए गए समाधान के लिए धन्यवाद। – Liz

+1

टाइमर के साथ अंतर: अंतराल को आग न करें (उदाहरण के लिए 1 सेकंड) एक क्रिया से पहले, जबकि यह एक क्रिया के बाद अंतराल को आग नहीं डालता है। मान लीजिए कि आप 't = 0' पर दबाएं, फिर' t = 2' और फिर 't = 2,1' दबाएं। फिर 'टी = 0' आग लग जाएगी, 'टी = 2 'आग लग जाएगी लेकिन' टी = 2,1' आग नहीं होगी (न ही टी = 2,2')। अक्सर आप अंतिम मूल्य आग लगाना चाहते हैं। – EricG

+0

यह समाधान इस समाधान के साथ बिल्कुल सही है: कई मामलों में अंतिम मूल्य (या माउस स्थिति) संसाधित नहीं किया जाएगा। – Oyvind

संबंधित मुद्दे