İşte (potansiyel) sorunu:Her 'foreach' yinelemesinde COM nesnesini serbest bırakmam gerekir mi?
Bir COM nesnesi oluşturup, her öğenin içinde döndürdüğü bir koleksiyonda yinelemek için bir 'foreach' kullanın. Koleksiyonda yinelediğim her bir elemanı serbest bırakmak zorunda mıyım? (Eğer aşağıdaki kodlara bakınız.) Eğer öyleyse, eğer bir nesne çalıştırılırken bir hata olması durumunda, bir 'nihayet' ifadesi içinde onu serbest bırakmanın etkili bir yolunu düşünemiyorum.
Herhangi bir öneriniz var mı? Bir referans hangi bırakmadan üzerinde hiçbir kontrole sahip perde arkasında yapılır olarak
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;
}
}
}
teşekkür ederiz! Aradığım cevap bu ve dreading. – Matt
Bu, bütün döngüyü çok daha yavaş yapar. – nawfal
@nawfal Bu neden döngüleri yavaşlatır? –