2009-03-24 45 views
8

Tôi có một lớp khởi tạo quá trình thoát COM. Lớp làC# dọn dẹp tài nguyên không được quản lý khi quá trình bị giết

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

và tôi gọi nó là như sau

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

     //Do stuff 

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

     Console.ReadLine(); 
    } 

bây giờ, đây dọn dẹp đối tượng COM của tôi khi chương trình thực hiện bình thường. Tuy nhiên, nếu tôi đóng chương trình ở giữa quá trình thực thi, khung công tác sẽ không bao giờ gọi mã giải phóng đối tượng không được quản lý của tôi. Đó là đủ công bằng. Tuy nhiên, có cách nào để buộc chương trình tự dọn dẹp mặc dù nó đã bị giết không?

EDIT: nó không giống hứa hẹn từ một kill cứng từ Taskmanager :(

Trả lời

8

Gói nó trong một thử cuối cùng hoặc sử dụng khoản sẽ giúp bạn có được hầu hết các cách đó :

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

các chi tiết cụ thể của how your app is being shutdown, tuy nhiên, sẽ chỉ ra bất kỳ biện pháp khác mà bạn có thể thực hiện (như sử dụng CriticalFinalizerObject).

I nghĩ rằng ứng dụng bảng điều khiển bị đóng (từ nhỏ x) giống với Ctrl-C - trong trường hợp này bạn có thể subscribe to Console.CancelKeyPress cho điều đó.

Chỉnh sửa: Bạn cũng nên ReleaseComObject until it returns <= 0.

5

Vâng, một thực hành tốt nhất là sử dụng using báo cáo:

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

Đó chủ yếu đặt finally khối trong để Bạn cần có các câu lệnh using khá nhiều bất cứ khi nào bạn có một cá thể IDisposable mà bạn chịu trách nhiệm về việc dọn dẹp. Tuy nhiên, nó không khắc phục được tình trạng toàn bộ quá trình của bạn bị hủy bỏ đột ngột. khá hiếm, và y Bạn có thể không muốn lo lắng về điều đó. (Thật khó để có được nó vòng.) Tôi muốn có mong đợi finalizer của bạn được gọi với mã trước của bạn mặc dù ..

+0

cũng không hoạt động. Các máy chủ COM vẫn còn sống nếu tôi giết quá trình ở giữa khối sử dụng. – Steve

+0

Làm thế nào để bạn giết chết quá trình? Bạn đã đặt bất kỳ đăng nhập vào các khối vứt bỏ của bạn để xem những gì đang xảy ra? –

+0

(Chỉ cần đóng chương trình với một tắt máy bình thường sẽ được sử dụng tốt. Chấm dứt nó từ Task Manager có thể là nastier.) Máy chủ COM tắt đúng cách nếu bạn đóng chương trình theo cách "bình thường"? –

Các vấn đề liên quan