c # - Korrekt CryptoAPITransform brug? Hukommelsestab

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har portet et gammelt stykke ustyret kode, der brugte Crypto API til 100\% administreret .NET-kode. Koden anvendte DES-algoritmen og måtte opretholde den af ​​flere grunde.


Da de CryptoAPITransform -felter, der er hentet fra CreateDecryptor og CreateEncryptor-metoderne, markeres som genbrugelige, tænkte jeg på at oprette en forekomst af dem og bruge dem, når det er nødvendigt.


Det ser ud til, at koden fungerede, men det forårsagede hukommelse lækager, så besluttede at oprette og bortskaffe en forekomst hver gang. Hidtil synes det ikke at lække, men jeg vil gerne vide, om jeg har brugt det forkert før, og i så fald, hvis jeg kunne genbruge forekomsten.


App'en er multi-threaded og gør en masse operationer på samme tid, så der kunne være problemer med at komme i gang, selvom jeg ikke kunne finde nogen undtagelse eller beskadiget besked. Også alle mine operationer blev lavet ved at kalde [[TransformFinalBlock .Her lyder det rigtigt for dig? Testning af appen er kedelig, men jeg tror jeg vil prøve mig selv, hvis synkronisering af trådene stopper lækagen ved en chance.

Bedste reference


Det var højst sandsynligt en trækrelateret fejl. Fra dokumentationen på CryptoAPITransform: [3]



  Alle offentlige statiske (Delt i Visual Basic) medlemmer af denne type er
  tråd sikker. Ethvert eksempel medlemmer er ikke garanteret at være tråd
  sikker.



Jeg kan ikke stress nok, hvor vigtigt det er at se på 'Thread Safety' dokumentationen for alle de klasser, hvis forekomster du deler under tråde.


Mit gæt er, at klassens implementering i dette tilfælde er baseret på en bestemt tilstand for korrekt brug/bortskaffelse af ustyret kode og ved at bruge dem i flere tråde, som du forårsagede en manglende bortskaffelse af disse korrekt.


Alt dette er selvfølgelig et gæt. Jeg ved ikke, hvordan denne klasse implementeres internt.