Ich habe eine WPF-Anwendung, die auf .NET 4.5.2 abzielt (aber normalerweise unter 4.6.1 läuft), und ich habe die Rechtschreibprüfung für einige TextBoxes und DataGridTextColumns aktiviert. Die Rechtschreibprüfung wird über einen Stil aktiviert, abhängig davon, welche Sprache der Benutzer ausgewählt hat (wir unterstützen derzeit nur en). Die Anwendungs- und Systemkulturen sind alle auf en oder en-US eingestellt. Ich verwende keine benutzerdefinierten Wörterbücher.WPF-Rechtschreibprüfung Finalizer - Safe Handle wurde geschlossen
Rechtschreibprüfung wird über die folgende Art aktiviert:
<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>
(Wir speichern die zuletzt gewählte Anwendungskultur die eingebaute in Application Objekt verwendet, und speichert nur die allgemeinsten Elternkultur Wenn das System des Benutzers eingestellt ist. In "en-US" speichern wir einfach "en", um Dinge zu vereinfachen.)
Die TextBox ist in einer DataTemplate definiert, die für TreeViewItems verwendet wird, falls dies einen Unterschied macht. Benutzer bearbeiten eher die TextBox als das DataGrid. Daher vermute ich, dass das Problem mit der TextBox zusammenhängt.
auf Windows 8 und 10, einige Benutzer sind Erfahrung ein Absturz in der Rechtschreibprüfung mit dem folgenden Stack-Trace:
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()
ich Google, Stackoverflow gesucht haben, und MSDN aber jeden Hinweis nicht finden können, zu diesem Problem. Ich weiß nicht, was meine Benutzer tun, um diesen Fall auszulösen, und ich konnte es nicht selbst reproduzieren. Meine Protokolle zeigen an, dass sie die Felder für die Rechtschreibprüfung nicht bearbeiten, wenn dies geschieht (tatsächlich war die letzte Bearbeitung, die sie vorgenommen haben, mindestens eine Minute oder zwei vor der Ausnahme). Hat jemand irgendwelche Ideen?
haben irgendwelche Gewindearbeiten am Laufen? Keine Aufrufe von thread.abort? – BugFinder
Erfolgt dies mitten in der Rechtschreibprüfung (wenn der Benutzer Text eingibt), am Ende (wenn der Benutzer seine Eingabe bestätigt) oder wenn sich die Ansicht mit Elementen mit aktivierter Rechtschreibprüfung ändert? Wie genau aktivieren Sie die Rechtschreibprüfung (das "über einen Stil abhängig ...")? – Sinatr
@BugFinder Keine Aufrufe von Thread.Abort. Alle meine Stacks verfolgen nur einige Leerlauf-Threadpool-Threads. –