Nem felügyelt erőforrások tisztítása

Az alkalmazás által létrehozott objektumok többségénél a .NET-szemétgyűjtőre támaszkodhat a memóriakezelés kezeléséhez. Ha azonban nem felügyelt erőforrásokat tartalmazó objektumokat hoz létre, a használatuk befejezésekor explicit módon fel kell szabadítania ezeket az erőforrásokat. A nem felügyelt erőforrások leggyakoribb típusai az operációs rendszer erőforrásait, például fájlokat, ablakokat, hálózati kapcsolatokat vagy adatbázis-kapcsolatokat burkoló objektumok. Bár a szemétgyűjtő képes nyomon követni egy nem felügyelt erőforrást tartalmazó objektum élettartamát, nem tudja, hogyan szabadíthatja fel és tisztíthatja meg a nem felügyelt erőforrást.

Ha a típusok nem felügyelt erőforrásokat használnak, tegye a következőket:

  • Implementálja a megsemmisítési mintát. Ehhez olyan implementációt IDisposable.Dispose kell biztosítania, amely lehetővé teszi a nem felügyelt erőforrások determinisztikus kiadását. Az Ön típusú fogyasztó a Dispose hívását akkor kezdeményezi, amikor az objektumra (és az általa használt erőforrásokra) már nincs szükség. A Dispose metódus azonnal felszabadítja a nem felügyelt erőforrásokat.

  • Abban az esetben, ha az ön típusú fogyasztó elfelejti hívni Dispose, adjon módot a nem felügyelt erőforrások felszabadítására. Ezt kétféleképpen teheti meg:

    • Használjon biztonságos fogópontot a nem felügyelt erőforrás burkolásához. Ez az ajánlott technika. A biztonságos fogópontok az System.Runtime.InteropServices.SafeHandle absztrakt osztályból származnak, és robusztus Finalize módszert tartalmaznak. Ha biztonságos fogópontot használ, először implementálja az IDisposable interfészt, majd hívja meg a biztonságos fogópont Dispose metódusát a IDisposable.Dispose megvalósítása során. A biztonságos fogantyú véglegesítőjét a szemétgyűjtő automatikusan meghívja, ha a Dispose metódust nem hívják meg.

      vagy

    • Definiáljon egy véglegesítőt. A véglegesítés lehetővé teszi a kezeltlen erőforrások nem determinisztikus felszabadítását, ha egy típus fogyasztója elmulasztja meghívni a IDisposable.Dispose-ot azok determinisztikus eldobásához.

      Figyelmeztetés

      Az objektum véglegesítése összetett és hibalehetőséget rejtő művelet lehet, ezért javasoljuk, hogy a saját véglegesítő helyett használjon biztonságos fogantyút.

Az Ön típusának felhasználói ezután a megvalósítás IDisposable.Dispose közvetlen hívásával felszabadíthatják a nem felügyelt erőforrások által használt memóriát. Ha helyesen implementál egy Dispose metódust, akkor a biztonságos fogantyú Finalize metódusa vagy a Object.Finalize metódus saját felülírása védelmet nyújt az erőforrások felszabadítására arra az esetre, ha a Dispose metódus nem kerül meghívásra.

Ebben a szakaszban

A Dispose metódus implementálása azt ismerteti, hogyan implementálható a nem kezelt erőforrások felszabadítására szolgáló Dispose minta.

Az IDisposable-t implementáló objektumok használata leírja, hogyan biztosítja egy típus fogyasztója, hogy annak Dispose megvalósítása meghívásra kerüljön. Ehhez erősen javasoljuk a C# using (vagy a Visual Basic Using) utasítás használatát.

Referenciák

Típus/tag Leírás
System.IDisposable Meghatározza a Dispose nem felügyelt erőforrások kiadásának módját.
Object.Finalize Ha a Dispose metódus nem oldja fel a nem felügyelt erőforrásokat, biztosítja az objektum véglegesítését.
GC.SuppressFinalize Letiltja a véglegesítést. Ezt a metódust szokás egy metódusból Dispose meghívni, hogy megakadályozza a véglegesítő végrehajtását.