2009-07-21 31 views
5

Hiểu biết của tôi về lớp này là bạn nên sử dụng nó khi bạn muốn chắc chắn rằng Finalizer (destructor) hoặc lớp được gọi, nhưng từ một vài thử nghiệm tôi đã làm, nó không có vẻ là đúng sự thật. Nếu nó không đảm bảo rằng phương pháp vứt bỏ được gọi là, có cách nào khác để làm điều đó không? Ví dụ, nếu tôi muốn chắc chắn rằng một số mã được chạy để kết thúc đối tượng của tôi, ngay cả khi tôi đóng chương trình của tôi thông qua Task Manager hoặc một cái gì đó?(.net) CriticalFinalizerObject - Nó thực sự làm gì?

+1

Nếu một số mã có thể chạy để kết thúc đối tượng của bạn, thì Trình quản lý tác vụ có thể không đóng được chương trình của bạn. Đây là lý do tại sao Trình quản lý tác vụ 'Kết thúc tiến trình' dừng quá trình của bạn mà không có sự hợp tác của nó bằng cách thực hiện tất cả việc thực thi khỏi nó, để ngăn chặn việc chạy bất kỳ mã, dọn dẹp hay cách khác. –

+0

Tôi sẽ chỉ lưu ý rằng câu hỏi cần được chỉnh sửa, hoặc nó đã xác định được một vấn đề trong hiểu biết về xử lý và quyết toán, như phương thức Finalize() và Dispose() (và các mô hình) hoàn toàn khác nhau. –

Trả lời

2

từ một vài thử nghiệm tôi đã làm, điều đó dường như không đúng.

finalizers in .Net là không xác định. Điều đó có nghĩa là không có bảo đảm chính xác khi trình kết thúc sẽ được gọi. Chỉ vì một đối tượng đã đi ra khỏi phạm vi hoặc thậm chí đã được xử lý, không có nghĩa là finalizer sẽ được gọi ngay lập tức. Các nhà sưu tập rác sẽ nhận được xung quanh nó vào một thời gian không rõ trong tương lai.

+0

Vâng, giống như 20 phút trôi qua và nó vẫn không thực thi mã: P –

+0

Bộ thu gom rác không quan tâm bao nhiêu thời gian đã trôi qua. Nếu không có phân bổ được thực hiện, nó sẽ không chạy. Vì vậy, câu hỏi quan trọng là mã của bạn đã làm gì trong 20 phút đó - hoặc liệu trình kết thúc có chạy khi bạn thoát khỏi ứng dụng hay không. – jalf

+0

Tôi đã mở ứng dụng, ctrl + alt + del'ed nó. –

7
+0

Hmm, vì vậy dường như CriticalFinalizerObject không phải là những gì tôi đang xem. Có cách nào tôi có thể chắc chắn rằng phương pháp Finalize của tôi sẽ được gọi, ngay cả khi có một ctrl + alt + del? –

+0

Nếu bạn đang tìm kiếm các hoạt động đáng tin cậy ngay cả khi hệ điều hành bị treo (mất điện?), Thì bạn nên xem xét xử lý giao dịch. –

+0

Tôi không cần nhiều, tôi chỉ cần có thể chạy một số mã khi ứng dụng bị đóng hoặc ctrl + alt + del'ed. –

2

Nếu bạn thực sự cần mã để chạy khi khi chương trình của bạn là Ctrl + Alt + Del'd, tôi không nghĩ rằng có bất kỳ cách nào khác ngoài việc có một chương trình riêng biệt mà giám sát đầu tiên tiểu bang. Nếu bạn thực sự cần nhiều kiến ​​trúc, tôi nghĩ bạn muốn sử dụng dịch vụ và một số ứng dụng khách, hoặc một cặp hoặc dịch vụ.

Đây là giả định, tuy nhiên, bạn đã xem xét các sự kiện Ứng dụng. Nếu bạn chưa có, hãy xem this overview.

EDIT Tốt hơn tổng quan đó, có thể, là ApplicationExit event.

+0

Cả hai dường như là các biểu mẫu liên quan, trong trường hợp này, đây thực sự là một ứng dụng Console. –

0

Phương thức Finalize() và phương pháp Dispose() là những thứ khác nhau.

Theo mặc định, Dispose sẽ không bao giờ được gọi. Bạn sẽ phải tự gọi nó theo phương thức Finalize. Hãy xem xét những điều sau (bỏ qua các lỗi hiển nhiên trong một mẫu hoàn thiện/xử lý thích hợp ở đây, để ngắn gọn):

public class Foo : IDisposable 
{ 
    public void Dispose() 
    { 
     // NOP 
    } 

    ~Foo() 
    { 
     Dispose(); 
    } 
} 
Các vấn đề liên quan