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ì?
Trả lời
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.
Vâng, giống như 20 phút trôi qua và nó vẫn không thực thi mã: P –
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
Tôi đã mở ứng dụng, ctrl + alt + del'ed nó. –
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? –
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. –
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. –
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.
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. –
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();
}
}
- 1. Expression.Bind() - nó thực sự làm gì?
- 2. Chuỗi thực sự là gì trong .NET?
- 3. Là obfuscation mã .NET thực sự giá trị nó?
- 4. StreamingContextStates.Clone thực sự làm gì?
- 5. CascadeType.REFRESH thực sự làm gì?
- 6. addChildViewController thực sự làm gì?
- 7. "OperationContext.Current.GetCallbackChannel" thực sự làm gì?
- 8. Dns.GetHostEntry Method (String) thực sự làm gì?
- 9. Các tệp pdb thực sự làm gì?
- 10. Process.Dispose() thực sự làm gì?
- 11. Điểm của jQuery ajax là gì? Nó có thực sự làm gì không?
- 12. Điều gì sẽ làm cho nó dễ dàng hơn để thực sự làm việc với Lua?
- 13. XCode 'Clean' thực sự làm gì?
- 14. Android SQLite - SQLiteDatabase.replace() thực sự làm gì?
- 15. Ifstream :: rdbuf() thực sự làm gì?
- 16. Mutex và semaphore thực sự làm gì?
- 17. gì một TransactionScope thực sự làm
- 18. regsvr32 filename.ax thực sự làm gì?
- 19. std :: ofstream :: close() thực sự làm gì?
- 20. Python __file__ thực sự làm gì?
- 21. Math.floor (Math.random()) +1 thực sự làm gì?
- 22. JVM flag CMSClassUnloadingEnabled thực sự làm gì?
- 23. Trình tạo pixel thực sự làm gì?
- 24. Sinatra :: Base.condition thực sự làm gì?
- 25. HaiPassFilter GPUImage thực sự làm gì?
- 26. Lệnh OSGi này thực sự làm gì?
- 27. Làm thế nào tôi có thể ngắt MATLAB khi nó thực sự thực sự bận rộn?
- 28. Kernel.Inject (ví dụ) là gì; thực sự làm gì?
- 29. .NET Garbage Collector - ưu tiên luồng của nó là gì?
- 30. Trong Delphi, System.TMonitor.Pulse và TMonitor.PulseAll thực sự làm gì
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. –
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. –