2012-01-11 40 views
6

Tôi đã xem qua một câu hỏi phỏng vấn mà tôi không biết câu trả lời (ít giúp đỡ :)) tốt nó nói cái gì đó đại loại:finalizer bị mắc kẹt trong vòng lặp vô hạn

Class SomeClass : IDisposable 
{ 
    public void Dispose() 
    { 
     while(true) 
     { 
     } 
    } 

    ~SomeClass() 
    { 
     Dispose(); 
    } 
} 

1) Có đối tượng được hoàn thành khi không còn được tham chiếu sau GC tiếp theo? Câu trả lời của tôi là KHÔNG, bởi vì luồng hoàn thiện sẽ bị mắc kẹt trên vòng lặp vô hạn.

2) Điều gì có thể được thực hiện trong các Vứt bỏ để chấm dứt hoàn thiện và bao nhiêu lần vòng lặp sẽ tiếp tục trước khi đối tượng được xử lý (với ra có tính đến thời gian nó sẽ chi tiêu trong Gen tiếp theo)

Tôi không đặc biệt rõ ràng về câu hỏi chính xác (2) .Tôi đã hết thời gian ...

Không biết câu trả lời Tôi đặt bộ đếm tĩnh đến 3 và gọi số 3 . công việc :), nhưng đó không phải là câu trả lời

Tôi đoán đó là điều cần làm với GC .SupressFinalize()? có thể gọi GC.SupressFinalize() trước khi vào vòng lặp?

bất kỳ ý tưởng nào nếu không có câu trả lời cho câu hỏi không rõ ràng, nhiều hơn những gì họ có thể nhắm đến?

+3

Bằng bất kỳ phương tiện này là một câu hỏi phỏng vấn tò mò - trong khi kiến ​​thức chuyên sâu về GC là một khu vực hợp lệ để nói chung, tôi không biết câu trả lời cho câu hỏi cụ thể này sẽ hiển thị người phỏng vấn (ngoài thực tế là bạn biết có một chuỗi duy nhất thực hiện các cuộc gọi cuối cùng) – BrokenGlass

Trả lời

8

Khá thay đổi những gì xảy ra. CLR sẽ chấm dứt chương trình, có một thời gian chờ 2 giây trên một finalizer.

+7

tài liệu? – Oded

+2

@Oded - CLR của Richter qua C#, trang 478 theo bài đăng trên blog này: http://nitoprograms.blogspot.com/2009/08/finalizers-at-process-exit.html –

+7

Tôi không thể repro thời gian chờ finalizer này trong một ứng dụng giao diện điều khiển, dường như vui vẻ chạy - liên kết ở trên dường như chỉ liên quan đến finalizers chạy ở thời gian thoát quá trình – BrokenGlass

0

bạn có thể kiểm tra tình trạng thanh lý khoản của đối tượng sử dụng một biến boolean điều này sẽ giúp phương pháp xử lý từ đi vào một vòng lặp vô hạn

class SomeClass : IDisposable 
{ 

    bool _disposed = false; 

    public void Dispose() 
    { 
     while (true && !_disposed) 
     { 
      _disposed = true; 
      Console.WriteLine("disposed"); 
     } 
    } 

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