2009-03-24 29 views
8

COM exe'yi işlem dışı bırakan bir sınıfa sahibim. sınıfC# süreç yönetimi öldürülürken yönetilmeyen kaynakları temizleme

public class MyComObject:IDisposable 
{ 
    private bool disposed = false; 
    MyMath test; 

    public MyComObject() 
    { 
     test = new MyMath(); 
    } 

    ~MyComObject() 
    { 
     Dispose(false); 
    } 

    public double GetRandomID() 
    { 
     if (test != null) 
      return test.RandomID(); 
     else 
      return -1; 
    } 

    public void Dispose() 
    { 
     Dispose(true); 

     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool disposing) 
    { 
     if (test != null) 
     { 
      Marshal.ReleaseComObject(test); 
      test = null; 
     } 

     disposed = true; 
    } 
} 

ve şimdi

static void Main(string[] args) 
    { 
     MyComObject test = new MyComObject(); 
     MyComObject test2 = new MyComObject(); 

     //Do stuff 

     test.Dispose(); 
     test2.Dispose(); 

     Console.ReadLine(); 
    } 

aşağıdaki programı normalde yürütüldüğünde, bu benim COM nesnesi temizler gibi diyoruz. Ancak, programı yürütmenin ortasında kapatırsam, çerçeve hiç yönetilmeyen nesneyi kaldıran kodu çağırmaz. Hangisi yeterince adil. Ancak, programın öldürülmesine rağmen kendini temizlemeye zorlamanın bir yolu var mı?

DÜZENLEME: esasen giriş finally blok koyar

using (MyComObject test = new MyComObject()) 
using (MyComObject test2 = new MyComObject()) 
{ 
    //Do stuff 
} 

: o taskmanager :(

cevap

8

Nihayet denemede veya cümleyi kullanarak sarmak yolun çoğunu alacaktır. : how your app is being shutdown ait

using (MyComObject test = new MyComObject()) 
using (MyComObject test2 = new MyComObject()) { 
    // do stuff 
} 
Console.ReadLine(); 

özelliklerini olsa, siz (CriticalFinalizerObject kullanmak gibi) yapabilirsiniz herhangi diğer tedbirleri belirleyecektir.

I (küçük x itibaren) kapalı alır bir konsol uygulaması bir Ctrl-C ile aynı olduğunu düşünüyorum - hangi Bunun için subscribe to Console.CancelKeyPress can durumda.

Düzenleme: Ayrıca ReleaseComObject until it returns <= 0 da olmalıdır. Bu, çalışmayan

5

Eh bir sabit öldürmek gelen umut verici görünmüyor, bir en iyi uygulama using ifadeleri kullanmaktır arama kapsamının sonunda otomatik olarak atma.Kaldırma sorumluluğunu aldığınızın bir örneğine sahip olduğunuzda, using ifadelerine sahip olmanız gerekir.Ancak, tüm işleminizin aniden durdurulduğu durumu düzeltmez. oldukça nadir ve y Ou bunun için endişelenmek istemeyebilir. (Yuvarlak almak çok zor.) beklenen sizin son kodunuzda bir önceki kodunuzla çağrılmanız gerekir ..

+0

. İşlemi, komut satırının ortasında öldürürsem, COM sunucuları canlı kalır. – Steve

+0

Süreci nasıl öldürüyorsun? Neler olup bittiğini görmek için bertaraf bloklarınıza herhangi bir giriş yaptınız mı? –

+0

(Programın normal kapatma ile kapatılması iyi olmalıdır. Görev Yöneticisi'nden sonlandırılması büyük olasılıkla daha büyük olabilir.) Programı "normal" bir şekilde kapatırsanız COM sunucusu düzgün bir şekilde kapanıyor mu? –