2016-06-08 14 views
2

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?

+0

haben irgendwelche Gewindearbeiten am Laufen? Keine Aufrufe von thread.abort? – BugFinder

+0

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

+0

@BugFinder Keine Aufrufe von Thread.Abort. Alle meine Stacks verfolgen nur einige Leerlauf-Threadpool-Threads. –

Antwort

0

Dieses Problem wird in .NET 4.7 behoben (siehe den Eintrag "WPF-Rechtschreibprüfung" auf der Seite Runtime Changes). Beachten Sie, dass NET 4.7 nicht unter Windows 10 November Update oder früher installiert wird. Die meisten Windows 10-Benutzer sollten jedoch bereits das Jubiläumsupdate installiert haben.

Beginnend mit dem .NET Framework 4.6.1 löst die Rechtschreibprüfung in WPF-Anwendungen beim Herunterfahren der Anwendung gelegentlich eine ObjectDisposedException aus.

In .NET Framework 4.7 wird die Ausnahmebedingung von der Laufzeitumgebung ordnungsgemäß behandelt, wodurch sichergestellt wird, dass Anwendungen nicht mehr beeinträchtigt werden. Es sollte beachtet werden, dass gelegentliche Ausnahmen der ersten Chance weiterhin in Anwendungen beobachtet werden, die unter einem Debugger laufen.