Voici le problème (potentiel):Ai-je besoin de libérer l'objet COM sur chaque itération 'foreach'?
Je crée un objet COM, puis utilise un 'foreach' pour parcourir chaque élément d'une collection qu'il renvoie. Ai-je besoin de relâcher chaque élément que je parcoure dans la collection? (Voir le code ci-dessous.) Si oui, je ne peux pas penser à un moyen de le libérer efficacement à partir d'une déclaration 'finally', juste au cas où il y aurait une erreur au cours de l'opération.
Des suggestions?
private static void doStuff()
{
ComObjectClass manager = null;
try
{
manager = new ComObjectClass();
foreach (ComObject item in manager.GetCollectionOfItems())
{
Log.Debug(item.Name);
releaseComObject(item); // <-- Do I need this line?
// It isn't in a 'finally' block...
// ...Possible memory leak?
}
}
catch (Exception) { }
finally
{
releaseComObject(manager);
}
}
private static void releaseComObject(object instance)
{
if (instance != null)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(instance);
}
catch
{
/* log potential memory leak */
Log.Debug("Potential memory leak: Unable to release COM object.");
}
finally
{
instance = null;
}
}
}
Merci! C'est la réponse que je cherchais et je redoutais. – Matt
Cela rendrait la boucle entière beaucoup plus lente, cependant. – nawfal
@nawfal Pourquoi cela rendrait la boucle plus lente? –