2010-11-30 16 views
14

İş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; 
     } 
    } 
} 

cevap

12

Sen, bir COM nesnesi ile bir foreach deyimi kullanmamalısınız. Bir for döngü geçip yapacak emin misin olurdu olmazdı never use two dots with COM objects.

yolu:

try 
{ 
    manager = new ComObjectClass(); 
    ComObject comObject = null; 
    ComObject[] collectionOfComItems = manager.GetCollectionOfItems(); 
    try 
    { 
     for(int i = 0; i < collectionOfComItems.Count; i++) 
     { 
      comObject = collectionOfComItems[i]; 
      ReleaseComObject(comObject); 
     } 
    }    
    finally 
    { 
     ReleaseComObject(comObject); 
    } 
} 
finally 
{ 
    ReleaseComObject(manager); 
} 
+0

teşekkür ederiz! Aradığım cevap bu ve dreading. – Matt

+0

Bu, bütün döngüyü çok daha yavaş yapar. – nawfal

+0

@nawfal Bu neden döngüleri yavaşlatır? –