2012-11-07 24 views
5

मैं अब मीडिया प्लेयर बना रहा हूं .. मैंने गानों आदि (कुछ डब्लूएमपी रीयलटाइम सर्च जैसे कुछ) खोजने के लिए रीयलटाइम सर्च फ़ंक्शन जोड़ा है, यानी जब आप कीवर्ड दर्ज करते हैं तो खोज होती है।अलग यूआई थ्रेड पर डब्ल्यूपीएफ नियंत्रण?

खोज प्रक्रिया के दौरान, डेटाबेस तक पहुंचने और एक आईनेमरेबल लोड करने के लिए बैकग्राउंड प्रोसेस के माध्यम से किसी अन्य थ्रेड पर किया जाता है। UI को UIElement के प्रेषक का आह्वान करके अद्यतन किया जाता है।

यह प्रक्रिया अपेक्षाकृत तेज़ है, लेकिन जब भी आप टेक्स्टबॉक्स में खोजशब्दों को दर्ज करते हैं, तो वहां एक छोटी सी अंतराल प्रतीत होती है, यह सूचीबॉक्स के कारण है। इटम्स सोर्स अपडेटिंग में कुछ समय लगता है। यानी आप "एडेले" खोजना चाहते हैं, जब आप "ए" टाइप करते हैं, तो खोज फ़ंक्शन "ए" के लिए परिणाम लोड करता है, लेकिन जैसा कि हम पूरे शब्द "एडेल" टाइप कर रहे हैं, यह कुछ समय " डी "" ई "" एल "" ई "और इन अक्षरों के बीच थोड़ा सा अंतराल है।

इस खोज प्रक्रिया के दौरान, जब मैं यूआई को अपडेट करना बंद करता हूं तो खोज प्रक्रिया बहुत चिकनी लगती है, यह केवल मेरे लिए है कि लिस्टबॉक्स थ्रेड को लॉक कर रहा है, इसलिए शेष खिलाड़ी का यूआई वहां फंस गया है जबकि सूचीबॉक्स है इसके प्रसंस्करण के साथ किया।

तो मुझे विश्वास है कि अगर मैं लिस्टबॉक्स नियंत्रण को किसी अन्य यूआई थ्रेड में डाल सकता हूं, तो मैं सूची बॉक्स को लोड करने के लिए किए गए समय के बावजूद खिलाड़ी के चिकनी प्रवाह को बनाए रख सकता हूं। एफवाईआई: डाटा विरूट्यूलाइजेशन & लिस्टबॉक्स में यूआई वर्चुअलाइजेशन काम कर रहा है

मैं लिस्टबॉक्स नियंत्रण को किसी अन्य यूआई थ्रेड पर कैसे रख सकता हूं? WPF, सी #

अग्रिम :)

+0

प्रभावी रूप से आप नहीं कर सकते ... कम से कम किसी भी व्यवहार्य तरीके से मैंने देखा नहीं है। – Servy

+0

.NET 4.5 का उपयोग कर?बाइंडिंग पर अब एक अच्छी देरी संपत्ति है जो आपके लिए एक आसान जीत हो सकती है, मूल रूप से इसे 100ms की तरह कुछ सेट करें और यह केवल बाइंडिंग अपडेट करेगा यदि उपयोगकर्ता उस अवधि के लिए टाइपिंग बंद कर देता है (या एंटर या टेक्स्टबॉक्स दबाता है फोकस खो देता है) – Andy

+1

एक है, और केवल एक, यूआई थ्रेड। –

उत्तर

5

आप हर कुंजी दबाने पर डेटाबेस में जानना चाहते हैं, तो - यह जब तेजी से (या यहां तक ​​कि सामान्य रूप से)

आप अनुरोध थ्रॉटल बंद बेहतर होगा टाइपिंग आप कुछ अंतराल पैदा करने के लिए जा रहा है, हम इस पर रुके का उपयोग प्रेषक धागा।

public static class DispatcherExtensions 
{ 
    private static Dictionary<string, DispatcherTimer> timers = 
     new Dictionary<string, DispatcherTimer>(); 
    private static readonly object syncRoot = new object(); 

    public static string DelayInvoke(this Dispatcher dispatcher, string namedInvocation, 
     Action action, TimeSpan delay, 
     DispatcherPriority priority = DispatcherPriority.Normal) 
    { 
     lock (syncRoot) 
     { 
      if (String.IsNullOrEmpty(namedInvocation)) 
      { 
       namedInvocation = Guid.NewGuid().ToString(); 
      } 
      else 
      { 
       RemoveTimer(namedInvocation); 
      } 
      var timer = new DispatcherTimer(delay, priority, (s, e) => 
       { 
        RemoveTimer(namedInvocation); 
        action(); 
       }, dispatcher); 
      timer.Start(); 
      timers.Add(namedInvocation, timer); 
      return namedInvocation; 
     } 
    } 


    public static void CancelNamedInvocation(this Dispatcher dispatcher, string namedInvocation) 
    { 
     lock (syncRoot) 
     { 
      RemoveTimer(namedInvocation); 
     } 
    } 

    private static void RemoveTimer(string namedInvocation) 
    { 
     if (!timers.ContainsKey(namedInvocation)) return; 
     timers[namedInvocation].Stop(); 
     timers.Remove(namedInvocation); 
    } 


} 

मान लिया जाये कि आप MVVM उपयोग नहीं कर रहे, आप आसानी से इस तरह तो आपके बटन में क्लिक

Dispatcher.CurrentDispatcher.DelayInvoke("UpdateSearch", 
     YourMethodThatStartsBackgroundThread,Timespan.FromSeconds(1)); 

इसके अलावा एक नोट के लायक इस्तेमाल कर सकते हैं: च आप 4.5 का उपयोग कर रहे वहाँ आप बाइंडिंग पर Delay संपत्ति है देख सकता था

+0

धन्यवाद आदमी, मैं इसे अभी देख लूंगा !! – Xero

+0

येसएसएस !! एक जादू की तरह काम करता है! कोड का बहुत उपयोगी टुकड़ा! – Xero

+0

@Xero आपको शायद माइक्रोसॉफ्ट के प्रतिक्रियाशील एक्सटेंशन में देखने से फायदा होगा। (आरएक्स)। मैंने देखा कि कई सारे ट्यूटोरियल यह दिखाने के लिए एक बिंदु बनाते हैं कि आप आसानी से प्रश्नों को कैसे थका सकते हैं। – Thelonias

1

ASP.NET में, धन्यवाद आमतौर पर हम दो techiniques

  • प्रतीक्षा अधिक से अधिक 3 चार के लिए खोज शुरू करने का उपयोग करें।
  • उपयोगकर्ता टाइपिंग बंद करने के बाद कुछ मिलीसेकंड की प्रतीक्षा कर रहा है और खोज शुरू करने से पहले, जैसे उपयोगकर्ता कुछ मिलीसेकंड से तेज़ी से टाइप करता है, तो आपके खोज शब्द में एक से अधिक चार शामिल होंगे। यह दूसरा विकल्प एक टाइमर शुरू करने में होता है जब उपयोगकर्ता टाइप करने के लिए शुरू होता है और इस टाइमर को शून्य पर सेट करता है (इसे रोक दिए बिना) प्रत्येक कुंजी दबाया जाता है। केवल खोज यदि आप खोज मापदंड में 3 या उससे अधिक वर्ण है, और का उपयोग करें: 2000 उपयोगकर्ता मिलीसेकंड के लिए टाइपिंग के लिए बंद हो जाता है जब (उदाहरण के द्वारा) आप खोज

एक आदर्श दृष्टिकोण इस दो techiniques गठबंधन करने के लिए है प्रदर्शन टाइमर।

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

  • कोई संबंधित समस्या नहीं^_^