2009-03-24 7 views
8

मेरे पास एक कक्षा है जो प्रक्रिया से बाहर एक COM exe को तुरंत चालू करती है। वर्गसी # सफाई अपरिवर्तित संसाधन जब प्रक्रिया मारे जाती है

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

है और मैं इसे कहते हैं

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

     //Do stuff 

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

     Console.ReadLine(); 
    } 

इस प्रकार अब, इस जब कार्यक्रम सामान्य रूप से निष्पादित करता है मेरी कॉम वस्तु को साफ। हालांकि, अगर मैं अपने निष्पादन के बीच में प्रोग्राम बंद करता हूं, तो फ्रेमवर्क कभी भी उस कोड को कॉल नहीं करता है जो मेरी अप्रबंधित वस्तु को जारी करता है। जो काफी उचित है। हालांकि, क्या इस कार्यक्रम को खुद को साफ करने के लिए मजबूर करने का कोई तरीका है, भले ही इसे मारा गया हो?

संपादित करें:

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

अनिवार्य रूप से करने के लिए finally ब्लॉकों डालता है यही कारण है कि: यह taskmanager :(

उत्तर

8

अंत में या क्लॉज का उपयोग करने में इसे लपेटने से आपको सबसे अधिक रास्ता मिल जाएगा :

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

how your app is being shutdown की बारीकियों, हालांकि, किसी भी अन्य उपायों आप (CriticalFinalizerObject का उपयोग कर की तरह) कर सकते हैं हुक्म चलाना होगा।

मुझे लगता है कि कि एक सांत्वना अनुप्रयोग (से थोड़ा एक्स) को बंद कर दिया जाता है कि एक Ctrl-C के रूप में एक ही है - जो मामले आप कर सकते हैं कि के लिए subscribe to Console.CancelKeyPress में।

संपादित करें: आपको ReleaseComObject until it returns <= 0 भी होना चाहिए।

5

खैर से एक हार्ड मार से वादा किया नहीं लगती है, एक सबसे अच्छा अभ्यास using बयानों का उपयोग करने के लिए है कॉल के दायरे में स्वचालित रूप से निपटान करें। आपके पास using कथन बहुत अधिक होना चाहिए जब भी आपके पास IDISposable का उदाहरण हो कि आप सफाई की ज़िम्मेदारी लेते हैं। हालांकि, यह उस स्थिति को ठीक नहीं करता है जहां आपकी पूरी प्रक्रिया अचानक समाप्त हो जाती है। हालांकि दुर्लभ दुर्लभ, और वाई हो सकता है कि इसके बारे में चिंता न करें। (इसे पाने के लिए बहुत मुश्किल है।) मेरे पास अपेक्षित आपके अंतिम कोड को आपके पिछले कोड के साथ बुलाया जाएगा ..

+0

जो या तो काम नहीं करता है। यदि मैं उपयोग ब्लॉक के बीच में प्रक्रिया को मारता हूं तो COM सर्वर जीवित रहते हैं। – Steve

+0

आप प्रक्रिया को कैसे मार रहे हैं? क्या आपने यह देखने के लिए अपने निपटान ब्लॉक में कोई लॉगिंग किया है कि क्या हो रहा है? –

+0

(सामान्य शटडाउन के साथ प्रोग्राम को बंद करना ठीक होना चाहिए। टास्क मैनेजर से इसे समाप्त करना नास्टियर होने की संभावना है।) यदि आप "सामान्य" तरीके से प्रोग्राम बंद करते हैं तो COM सर्वर ठीक से बंद हो जाता है? –

संबंधित मुद्दे