2016-05-16 11 views
6

में मेरे आवेदन को धीमा कर रही है मैं वर्तनी जांच के लिए अपने WinForm एप्लिकेशन के अंदर एक WPF टेक्स्टबॉक्स का उपयोग कर रहा हूं। प्रत्येक बार जब मैं एक बना देता हूं, तो मैं एक ही फ़ाइल को कस्टम डिक्शनरी में लोड करता हूं। हाल ही में सभी ठीक रहे हैं। अब, वे एक सेकंड तक लोड करने में काफी समय लगाते हैं। कुछ रूपों में 30 या उससे अधिक का अर्थ है, जिसका अर्थ लगभग आधा मिनट है। ऐसा लगता है कि विंडोज 10 (विंडोज 8 जैसा कि मैंने मूल रूप से पोस्ट नहीं किया था)। एप्लिकेशन डॉटनेट 4.0 के तहत चल रहा है, मैंने 4.5 और 4.6 (4.61 नहीं) की कोशिश की है और सभी संस्करण धीमे हैं।टेक्स्टबॉक्स और कस्टम शब्दकोशों के साथ वर्तनी सी # डब्ल्यूपीएफ

मैंने sfaust के प्रश्न Spell check textbox in Win10 - Slow और am7zd के उत्तर को देखा है। इनके लिए धन्यवाद, मैंने HKEY_CURRENT_USER \ Software \ Microsoft \ वर्तनी \ शब्दकोश में ग्लोबल रजिस्ट्री कुंजी को देखा। मेरे पास 580 प्रविष्टियां हैं (फ़ाइलों से मेल खाने के बिना प्रविष्टियों को छीनने के बाद) और अभी भी चीजें धीमी हैं।

वर्तमान में, हर बार जब मैं किसी पाठ बॉक्स बनाने और इसे करने के लिए एक कस्टम शब्दकोश जोड़ने के लिए, एक नई प्रविष्टि _GLOBAL_

  • में उत्पन्न किया जा रहा है वहाँ में कस्टम शब्दकोश लोड हो रहा है की तुलना में काम करने के लिए एक बेहतर तरीका है फाइल से हर बार?
  • क्या कोई नया खाता बनाने के बजाय हर बार _GLOBAL_ में एक ही प्रविष्टि का पुनः उपयोग करने का कोई तरीका है?
  • क्या ग्लोबल में मेरे प्रविष्टियों द्वारा बनाई गई पिछली प्रविष्टियों को साफ़ करने का एक साफ तरीका है और एप्लिकेशन को बंद करते समय उनकी मिलान .dic फ़ाइलें (या इसे पुनरारंभ करने पर)?
  • हर बार जब मैं अपना आवेदन शुरू करता हूं तो मैं _GLOBAL_ को साफ़ कर सकता हूं। इससे मुझे जो गति चाहिए वह वापस लाता है, लेकिन नकारात्मक क्या है?

कोई सलाह आभारी रूप से प्राप्त हुई।

उत्तर

3

किसी और से कोई उत्तर नहीं है, तो यह है कि मैं क्या किया है:

  1. मुझे यकीन है कि बनाया मैं कस्टम शब्दकोशों के साथ सभी बक्सें पर CustomDictionaries.Remove का उपयोग प्रपत्र वे पर हैं बंद करने से पहले। यह _GLOBAL_ में नई प्रविष्टियों और ऐपडेटा \ स्थानीय \ Temp में संबंधित फ़ाइलों से छुटकारा पाता है।

लेकिन बार जब कोई बात बिगड़ जाए या उपयोगकर्ता सिर्फ काम समाप्त होता है, जगह में _GLOBAL_ प्रविष्टियों और .dic फ़ाइलें छोड़ रहा है, तो वहाँ हो जाएगा:

  1. मैं चीजों को एक मंच आगे ले जाने का फैसला किया। जब मैं अपना आवेदन शुरू करता हूं, तो मैं केवल _GLOBAL_ में प्रविष्टियों को साफ़ नहीं करता हूं, जिनके पास मेल खाने वाली फाइलें नहीं हैं (जैसा ऊपर उल्लिखित पिछली पोस्ट में सुझाया गया है), लेकिन ऐपडेटा \ स्थानीय \ Temp में .dic फ़ाइलों का जिक्र करने वाली सभी प्रविष्टियों को भी निकालने के लिए। मेरा सिद्धांत यह है कि किसी भी व्यक्ति ने प्रविष्टियों को छोड़ दिया है, इसका मतलब यह नहीं था कि अन्यथा वे .dic फ़ाइल को किसी भिन्न फ़ोल्डर में सहेज लेंगे (जैसा कि माइक्रोसॉफ्ट ऑफिस करता है)।

    try 
        { 
    
         string[] allDictionaries = (string[])Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Spelling\Dictionaries", "_Global_", new string[0]); 
    
         if (allDictionaries.Count() > 0) 
         { 
          List<string> realDictionaries = new List<string>(); 
          bool changedSomething = false; 
    
          foreach (string thisD in allDictionaries) 
          { 
           if (File.Exists(thisD)) 
           { 
            if (thisD.Contains(@"\AppData\Local\Temp\")) 
            { 
             // Assuming that anyone who wants to keep a permanent .dic file will not store it in \AppData\Local\Temp 
             // So delete the file and don't copy the name of the dictionary into the list of good dictionaries. 
             File.Delete(thisD); 
             changedSomething = true; 
            } 
            else 
            { 
             realDictionaries.Add(thisD); 
            } 
           } 
           else 
           { 
            // File does not exist, so don't copy the name of the dictionary into the list of good dictionaries. 
            changedSomething = true; 
           } 
          } 
    
          if (changedSomething) 
          { 
           Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Spelling\Dictionaries", "_Global_", realDictionaries.ToArray()); 
          } 
         } 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show(this, "Error clearing up old dictionary files.\n\nFull message:\n\n" + ex.Message, "Unable to delete file", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
        } 
    

मैं अभी भी सोच रहा हूँ अगर यह _GLOBAL_ में प्रविष्टियों को AppData \ Local \ अस्थायी में फ़ाइलों का उल्लेख स्पष्ट करने के लिए पूरी तरह से सुरक्षित है। निश्चित रूप से लोगों को एक अस्थायी फ़ोल्डर में महत्वपूर्ण सामान नहीं छोड़ना चाहिए ... क्या वे चाहिए?

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

+0

वास्तव में अच्छा स्पष्टीकरण साथी। मुझे अभी एक ही समस्या का सामना करना पड़ रहा है (win8 ने बहुत अच्छा काम किया लेकिन अब Win10 में कुछ मशीनों में धीमी गति से काम कर रहा है)। मुझे लगता है कि मैं आपके जैसे कामकाज को लागू करूंगा, लेकिन मैं सोच रहा हूं कि कितने साइड इफेक्ट्स _Global_ वैरिएबल सामग्री को हटा सकते हैं (उदाहरण के लिए एमएस वर्ड गलत वर्तनी क्षमताओं को खोना? आदि) –

+0

शब्द और (जहां तक ​​मैं देख सकता हूं) सभी कार्यालय उत्पाद _GLOBAL_: C: \ Users \ yourusername \ AppData \ Roaming \ Microsoft \ Office \ 16.0 \ fbf00836 \ Proofing \ RoamingCustom.dic में इस तरह की एक प्रविष्टि का उपयोग करते हैं। इसलिए यह AppData \ Local \ Temp में प्रविष्टियों को समाशोधन से प्रभावित नहीं है। मैं सोच रहा हूं कि क्या यह कस्टम डिक्शनरी के साथ केवल डॉटनेट कार्यक्रम है जो .dic फ़ाइलों के लिए इस टेम्पल फ़ोल्डर का उपयोग करता है, लेकिन इसके बारे में कुछ भी नहीं लिखा है। – Michael

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