Warum schlägt SHA1.ComputeHash bei hoher Auslastung mit vielen Threads fehl?

7

Ich sehe ein Problem mit einem von mir gepflegten Code. Der folgende Code hat ein private static SHA1 -Member (was ein IDisposable ist, aber da es static ist, sollte es niemals finalisiert werden). Unter Stress löst dieser Code jedoch eine Ausnahme aus, die darauf hinweist, dass er geschlossen wurde:

%Vor%

Der fragliche Code lautet:

%Vor%

Meine Frage ist offensichtlich, was dieses Problem verursachen könnte. Kann der Aufruf von SHA1.Create automatisch fehlschlagen (wie viele kryptografische Ressourcen sind verfügbar)? Könnte dies durch das Herunterfahren der Anwendungsdomäne verursacht werden?

Irgendwelche anderen Theorien?

    
MvdD 27.10.2014, 16:48
quelle

1 Antwort

23

Gemäß der Dokumentation für die Basisklasse HashAlgorithm

  

Alle öffentlichen statischen Member (Shared in Visual Basic) dieses Typs sind threadsicher. Alle Instanzmitglieder sind nicht garantiert threadsicher.

Sie sollten diese Klassen nicht zwischen Threads teilen, bei denen verschiedene Threads gleichzeitig ComputeHash für dieselbe Instanz aufrufen und aufrufen.

BEARBEITEN Dies verursacht Ihren Fehler. Der folgende Stresstest führt zu einer Reihe von Fehlern, da mehrere Threads ComputeHash für dieselbe Hashalgorithmusinstanz aufrufen. Dein Fehler ist einer von ihnen.

Im Einzelnen habe ich bei diesem Stresstest die folgenden Fehler gesehen:

  • System.Security.Cryptography.CryptographicException: Der Hash ist für die Verwendung im angegebenen Status nicht gültig.
  • System.ObjectDisposedException: Sicheres Handle wurde geschlossen

Stresstest-Codebeispiel:

%Vor%     
Andy Brown 27.10.2014, 17:01
quelle

Tags und Links