使用文本框和自定义词典进行拼写会降低我在C#WPF中的应用程序速度

我在WinForm应用程序中使用WPF TextBoxes进行拼写检查。 每次创建一个,我都将相同的文件作为CustomDictionary加载。 一切都很好,直到最近。 现在,它们需要很长时间才能加载,最多一秒钟。 有些表格有30个或更多,意味着延迟近半分钟。 这似乎是Windows 10(不是我最初发布的Windows 8)的情况。 应用程序在DotNet 4.0下运行,我尝试过4.5和4.6(不是4.61),所有版本都很慢。

我已经看到了sfaust的问题在Win10中拼写检查文本框 – 慢和am7zd的答案。 多亏了这些,我查看了HKEY_CURRENT_USER \ Software \ Microsoft \ Spelling \ Dictionaries中的GLOBAL注册表项。 我有580个条目(修剪掉没有匹配文件的条目)但仍然很慢。

目前,每次创建TextBox并向其添加自定义词典时,似乎都会在_GLOBAL_中生成一个新条目

  • 有没有比每次从文件加载自定义词典更好的做事方式?
  • 有没有办法在每次重复使用_GLOBAL_中的相同条目而不是创建一个新条目?
  • 在关闭应用程序(或重新启动它)时,是否有一种清除方式来清除我的应用程序创建的GLOBAL中的先前条目及其匹配的.dic文件?
  • 每次启动应用程序时,我都可以完全清除_GLOBAL_。 这带回了我想要的速度,但缺点是什么?

任何建议都感激不尽。

没有其他人的答案,所以这就是我所做的:

  1. 我确保在关闭它们所在的表单之前,在所有带有自定义词典的文本框上使用CustomDictionaries.Remove。 这消除了_GLOBAL_中的新条目以及AppData \ Local \ Temp中的相关文件。

但有时会出现问题或用户刚刚结束任务,留下_GLOBAL_条目和.dic文件,所以:

  1. 我决定进一步采取行动。 当我启动我的应用程序时,我不仅会清除_GLOBAL_中没有匹配文件的条目(如上面引用的上一篇文章中所述),还要删除引用AppData \ Local \ Temp中.dic文件的所有条目。 我的理论是,任何在那里留下条目的人都不是故意的,否则他们可能会将.dic文件保存在不同的文件夹中(就像Microsoft Office那样)。

    try { string[] allDictionaries = (string[])Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Spelling\Dictionaries", "_Global_", new string[0]); if (allDictionaries.Count() > 0) { List realDictionaries = new List(); 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 \ Temp中文件的条目是否完全安全。 当然人们不应该把重要的东西放在临时文件夹中……不是吗?

什么是真正好的将是CustomDictionaries.Add的重载,它允许我们设置.dic文件的名称和文件夹,允许同一个应用程序中的所有文本框共享相同的.dic文件,并确保我们不留下一堆冗余的条目和文件,看起来随机的名字在第一位徘徊…..请微软。