Dieser Fehler tritt sporadisch und unerklärlicherweise auf, insbesondere beim Herstellen einer Verbindung mit unserer Sitzungsstatusdatenbank. Hier ist der Fehler:
%Vor%Im Windows-Ereignis-Viewer erscheint manchmal ein möglicher Fehler:
%Vor%EDIT: ein anderer Geschmack der Ausnahme ist wie folgt:
%Vor%Kann jemand vorschlagen:
Wie sich herausstellte, haben wir den Fehler bis zur Deserialisierung eines CancellationToken mit Json.Net verfolgt.
Das zugrunde liegende Problem tritt auf, wenn Code immer noch versucht, ein OS-Handle zu verwenden, das freigegeben wurde. Dies kann natürlich passieren, wenn Ihr Code direkt mit Handles arbeitet. Unser Code tut das nicht, aber es stellt sich heraus, dass dies mit Json.Net passieren kann. Hier ist wie:
Wir hatten eine Klasse wie folgt:
%Vor%Das Problem trat auf, als jemand MyClass vom Typ CancellationToken eine Eigenschaft hinzufügte:
%Vor%Hier ist das Problem. Wenn es serialisiert wird, sieht ein CancellationToken wie folgt aus:
%Vor%Beachten Sie, dass die Ausführung der WaitHandle-Eigenschaft des Tokens und das Serialisieren des Werts des zugrunde liegenden Betriebssystem-Handles (1508) dazu führt, dass dies "faul" ist.
Wenn wir das Token deserialisieren, startet Json.Net mit new CancellationToken()
(entspricht CancellationToken.None
). Anschließend wird die Handle
-Eigenschaft des WaitHandle
dieses Tokens mit dem gespeicherten IntPtr
-Wert ausgefüllt. Ein offensichtlicher Weg, auf dem dies schief geht, ist, dass das WaitHandle des Standard-CancellationTokens jetzt auf ein wahrscheinliches ungültiges Handle zeigt. Das größere Problem ist jedoch, dass das Aktualisieren des Handles das ursprüngliche SafeHandle von WaitHandle dereferenziert, sodass der Garbage Collector seinen Finalizer ausführen und ihn bereinigen kann. Sie können dann Opfer der folgenden Reihe von Ereignissen werden:
Hier ist ein Code, der das Problem mit einem FileStream
:
Sie könnten versuchen, in den SQL Server-Konfigurationsmanager zu wechseln und ein oder mehrere Protokolle zu deaktivieren, um zu sehen, ob das hilft. Wenn der SQL Server und der Client sich auf demselben Computer befinden, verwenden Sie möglicherweise gemeinsam genutzten Speicher, und das System hat den Heapspeicher für Handles erschöpft. Versuchen Sie, Verbindungen zu zwingen, TCP zu verwenden, und sehen Sie, ob Sie das gleiche Problem bekommen.
Tags und Links .net sql-server c# asp.net