Avatar billede the-gnu.dk Nybegynder
22. maj 2006 - 18:19 Der er 6 kommentarer

Frigørelse af ressourcer

Jeg har min form:

form = new AAA();
form.events += ...;
form.show();
--- vent for luk-event ---
form.close();

Hver gang laver jeg en ny instans af AAA() (nødvendigt).

Problemet er, at den ikke får frigjort alle ressourcer tilhørende formen.

I min Windows Jobliste under "USER-Objekter" tæller den flere og flere jo flere gange min form bliver instantieret.

Jeg prøver så med Ants Profiler for at overvåge ressourcerne, hvor jeg oplever, at COM-objekter, AxShockwaveFlashObjects og AxWMPLib namespaces laver flere og flere objekter hver gang jeg åbner en ny form. Kan det virkelig være rigtigt?

En løsning?
Avatar billede arne_v Ekspert
22. maj 2006 - 18:48 #1
Faar du kaldt Dispose paa alt det som har en saadan ?
Avatar billede the-gnu.dk Nybegynder
22. maj 2006 - 18:52 #2
Nej..

Jeg går ud fra, at Close(); kalder Dispose() på alle de Controls der er tilføjet.
Avatar billede dr_chaos Nybegynder
22. maj 2006 - 19:23 #3
Prøv også at kalde:
base.ExitThreadCore();
Avatar billede tuxic Nybegynder
23. maj 2006 - 21:01 #4
AAA kan jo have medlemmer der skal disposes, men hvis AAA ikke selv tilsidesætter Dispose, kan medlemmerne jo ikke disposes af .NETs Form.Dispose. At dømme efter dokumentationen og dit eksempel ovenfor (som jo ikke vil oversætte og derfor måske ikke afspejler din faktiske kode) burde Close kalde Dispose. Men det ville da være pænere at lave en using rundt om form.
Avatar billede the-gnu.dk Nybegynder
24. maj 2006 - 08:39 #5
Efter hvad jeg kan debugge mig til, er det nogle objekter som bliver lavet udenform min managed code, derfor har jeg svært ved at gøre noget ved det. Close() kalder Dispose() på de Controls der er tilføjet til Formen. Dog har jeg fundet et par småting rundt omkring, som f.eks. NotifyIcon(), når man skifter Icon = ; og bruger en embedded resource, skal man huske at kalde .Icon.Dispose(); først.
Avatar billede tuxic Nybegynder
01. juni 2006 - 22:24 #6
Det vil være meget mystisk hvis fejlene er noget du ikke kan gøre noget ved. (Hvis der er tale om en ren .NET application).

Winforms kan være lidt drilsk fordi man kan risikere at objekter (klasser der nedarver Control) ikke kan frigives/GCes selvom man ikke holder nogen referencer til dem i sit program. Det skyldes jo at de til syvende og sidst må have et HANDLE til at vise kontrollen. HANDLE gør at marshalling services essentielt holder liv i winforms control objekter indtil de disposes (ihvertfald hvis controllen har været vist). Derfor bør man altid Dispose alle controller man fx fjerner fra en form eller som du selv fandt med Icons.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester