Aquí está el problema (potencial):¿Debo liberar el objeto COM en cada iteración 'foreach'?
Creo un objeto COM, y luego uso un 'foreach' para recorrer cada elemento de una colección que devuelve. ¿Debo liberar cada elemento individual al que repito en la colección? (Consulte el código a continuación.) Si es así, no puedo pensar en una forma efectiva de liberarlo desde una declaración 'finally', solo en caso de que haya un error a medida que se opera el elemento.
¿Alguna sugerencia?
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;
}
}
}
Gracias! Esa es la respuesta que estaba buscando y temiendo. – Matt
Eso haría todo el ciclo mucho más lento, sin embargo. – nawfal
@nawfal ¿Por qué esto haría que el ciclo fuera más lento? –