bonjour
peut on forcer a faire un delete ? sinon comment maitriser la destruction des instances ?
Merci
bonjour
peut on forcer a faire un delete ? sinon comment maitriser la destruction des instances ?
Merci
Bonjour,
Dans des cas extrêmes tu peux utiliser les méthodes suivantes :
La première force le garbage collector à libérer la mémoire inutilisée (de manière asynchrone). La deuxième permet d'attendre que le garbage collector ait fini de libérer la mémoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 GC.Collect(); GC.WaitForPendingFinalizers();
Tu trouveras un exemple concret par ici.
Ce code ne force pas la suppression des objets qui étaient dans la queue de finalisation.
Il faut faire :
Si on ne refait pas le GC.Collect(), les objets présents en queue de finalisation ne sont plus référencés, mais pas libérés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
Par ailleurs, GC.Collect() est synchrone, c'est le traitement des finalisations qui se fait sur des threads séparés.
A lire : Les règles du forum
Exactement, d'où le WaitFor[...]. Ceci dit, il n'est pas nécessaire/recommandé de forcer une récupération (GC) de la mémoire. Si une variable doit être libérée, cela doit se faire par l'implémentation de IDisposable et l'appel de Dispose, pas par une récupération au niveau du GC.
Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.
Bonnes pratiques pour les accès aux données
Débogage efficace en .NET
LINQ to Objects : l'envers du décor
Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter
Certes, il est préférable de passer par IDisposable, sauf dans des cas très maitrisés.
Je corrigeais juste deux approximations, l'une sur le fait qu'il faut réappeller GC.Collect après le WaitForPendingFinalizer pour libérer effectivement tout ce qui est libérable, l'autre sur le fait que le GC.Collect est asynchrone, ce qui n'est pas tout à fait vrai.
A lire : Les règles du forum
Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.
Bonnes pratiques pour les accès aux données
Débogage efficace en .NET
LINQ to Objects : l'envers du décor
Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter
Le garbage collector détruit automatiquement les objets sur lesquels il n'y a plus de référence. Ce n'est pas fait immédiatement, seulement quand le système a besoin de récupérer de la mémoire (ou quand tu appelles GC.Collect). Par contre s'il reste des références sur tes objets, il ne seront pas détruits, quoi que tu fasses.
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Partager