我在 WinForm 应用程序中使用 WPF 文本框进行拼写检查。每次创建一个文件时,我都会将相同的文件作为 CustomDictionary 加载。直到最近一切都很好。现在,它们需要很长时间才能加载,最多一秒钟。有些表格有 30 个或更多,这意味着延迟近半分钟。 Windows 10 似乎就是这种情况(而不是我最初发布的 Windows 8)。该应用程序在DotNet 4.0下运行,我尝试过4.5和4.6(不是4.61),所有版本都很慢。
我看过sfaust的问题Win10 中的拼写检查文本框 - 速度慢以及 am7zd 的回答。多亏了这些,我才看了GLOBALHKEY_CURRENT_USER\Software\Microsoft\Spelling\Dictionaries 中的注册表项。我有 580 个条目(在删除没有匹配文件的条目之后),但速度仍然很慢。
目前,每次我创建一个文本框并向其添加自定义字典时,似乎都会在 _GLOBAL_ 中生成一个新条目
- 有没有比每次从文件中加载自定义字典更好的方法?
- 有没有一种方法每次都重复使用 _GLOBAL_ 中的相同条目而不是创建新条目?
- 有没有一种干净的方法来清除以前的条目GLOBAL在关闭应用程序(或重新启动应用程序时)时由我的应用程序及其匹配的 .dic 文件创建?
- 每次启动应用程序时,我都可以完全清除 _GLOBAL_ 。这恢复了我想要的速度,但有什么缺点呢?
任何建议都非常感激。
没有其他人的答案,所以这就是我所做的:
- 我确保在关闭它们所在的表单之前,对所有带有自定义词典的文本框使用 CustomDictionaries.Remove 。这会删除 _GLOBAL_ 中的新条目以及 AppData\Local\Temp 中的相关文件。
但有时会出现问题,或者用户只是结束任务,而将 _GLOBAL_ 条目和 .dic 文件留在原处,因此:
-
我决定更进一步。当我启动我的应用程序时,我不仅会清理 _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<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\Temp 中文件的条目是否完全安全。当然,人们不应该将重要的东西留在临时文件夹中......应该吗?
真正好的做法是重载 CustomDictionaries.Add,它允许我们设置 .dic 文件的名称和文件夹,允许同一应用程序中的所有文本框共享相同的 .dic 文件,并确保我们不这样做首先留下一堆看似随机名称的冗余条目和文件......请微软。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)