WPF拼写检查终结器 - 安全手柄已关闭

时间:2016-06-08 14:26:19

标签: c# wpf spell-checking

我有一个针对.NET 4.5.2的WPF应用程序(但通常在4.6.1下运行),并且我已经对几个TextBox和DataGridTextColumns启用了拼写检查。根据用户选择的语言(我们目前仅支持en),通过样式启用拼写检查。应用程序和系统文化都设置为en或en-US。我没有使用任何自定义词典。

通过以下样式启用拼写检查:

<Style TargetType="TextBox">
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Source={x:Static Properties:Settings.Default}, Path=Culture}"
                           Value="en" />
                <Condition Binding="{Binding Source={x:Static diagnostics:Debugger.IsAttached}}"
                           Value="False" />
            </MultiDataTrigger.Conditions>
            <Setter Property="SpellCheck.IsEnabled"
                    Value="True" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

(我们使用内置的ApplicationSettings对象存储最后选择的应用程序文化,并且仅保存最通用的父文化。如果用户的系统设置为&#34; en-US&#34;,我们只是存储&#34; en&#34;以简化事情。)

TextBox是在用于TreeViewItems的DataTemplate中定义的,以防万一。用户更可能编辑TextBox而不是DataGrid,因此我怀疑该问题与TextBox有关。

在Windows 8和10上,某些用户在拼写检查程序中遇到崩溃,其中包含以下堆栈跟踪:

System.ObjectDisposedException: Safe handle has been closed
   at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
   at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
   at System.Threading.WaitHandle.WaitOne(Int32 millisecondsTimeout, Boolean exitContext)
   at System.Windows.Documents.WinRTSpellerInterop.ClearDictionaries(Boolean isDisposeOrFinalize)
   at System.Windows.Documents.WinRTSpellerInterop.Dispose(Boolean disposing)
   at System.Windows.Documents.WinRTSpellerInterop.Finalize()

我搜索了Google,StackOverflow和MSDN,但无法找到对此问题的任何引用。我不知道我的用户正在做什么来触发这个案例,我自己也无法重现它。我的日志表明,当发生这种情况时,他们没有编辑启用拼写检查的字段(实际上,他们所做的最后一次编辑至少是异常前一分钟或2分钟)。有没有人有任何想法?

1 个答案:

答案 0 :(得分:0)

此问题已在.NET 4.7中解决(请参阅&#34; WPF拼写检查程序&#34; Runtime Changes页面上的条目)。请注意,NET 4.7将不会安装在Windows 10 11月更新或更早版本上。但是,大多数Windows 10用户现在应该已经参加了周年纪念更新。

  

从.NET Framework 4.6.1开始,WPF应用程序中的拼写检查程序偶尔会在应用程序关闭期间抛出ObjectDisposedException。

     

在.NET Framework 4.7中,运行时正常处理异常,从而确保应用程序不再受到不利影响。应该注意的是,在调试器下运行的应用程序中偶尔会出现偶然的第一次机会异常。