2008-10-29 37 views
10

Tôi đang làm việc trên một đoạn mã thư viện xung quanh IDisposable. Đường dẫn được quản lý (thông qua using) có thể dễ dàng kiểm tra được. Tôi đang tự hỏi về finalizer mặc dù: Đang gọi System.GC.Collect() đủ để buộc finalizer để chạy?Làm thế nào để kiểm tra đơn vị IDisposable?

+0

Nếu bạn dán vào mẫu được chỉ định cho IDisposable, tôi chắc chắn rằng việc kiểm tra đơn vị sẽ hữu ích. –

+0

xin lỗi, điều đó phải là "Tôi không chắc rằng thử nghiệm đơn vị sẽ hữu ích ... –

+0

@Mitch: triển khai IDisposable chính xác, để các tài nguyên được quản lý và không được quản lý được xử lý vào đúng thời điểm không phải là tầm thường Vì mã thư viện được đề cập có trách nhiệm chính xác rằng tôi không thấy một điểm trong thử nghiệm _not_ mà ... –

Trả lời

8

Không, GC.Collect() gọi là không đồng bộ, bạn cũng sẽ cần phải gọi đây là:

System.GC.WaitForPendingFinalizers(); 
+1

Cảm ơn một đống! Tôi biết lý do tại sao tôi hỏi :-) –

+1

Tôi nghĩ rằng GC.Collect() chính nó là đồng bộ (tức là nó sẽ giải phóng bất kỳ bộ nhớ nó có thể bởi thời gian nó trở về) nhưng finalizers mình chạy riêng biệt.Tôi có thể hoàn toàn sai mặc dù ... –

+0

Tôi đang làm cả hai bây giờ và các bài kiểm tra thông qua mỗi tim e. Đó là, được gọi là điểm mở rộng chính xác từ trình hoàn thiện. –

0

Bạn có thể thử giao diện IDisposable và mong đợi một cuộc gọi đến Dispose? Điều đó ít nhất sẽ cho phép bạn thấy khi nào vật thể thực sự được xử lý.

+0

Đặt điểm ngắt là đủ để khám phá điều đó. Tôi đang thử nghiệm của Dispose() 's thực hiện mặc dù, không cho dù đó là gọi là –

0

Tôi nghĩ rằng tôi sẽ hướng nạc làm Finalize() gọi phương thức khác, và kiểm tra rằng người khác phương pháp làm những gì bạn muốn. Bạn sẽ không nhận được 100% mã vùng phủ sóng, nhưng ít nhất bạn sẽ biết rằng phương thức giải phóng tài nguyên của đối tượng đúng cách.

2

Tôi sẽ xem xét số Dispose, Finalization, and Resource Management tài liệu tham khảo tốt nhất về chủ đề mà tôi biết. Sử dụng mẫu của họ:

~ComplexCleanupBase() 
{ 
    Dispose(false); 
} 

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

protected override void Dispose(bool disposing) 
{ 
    if (!disposed) 
    { 
     if (disposing) 
     { 
      // dispose-only, i.e. non-finalizable logic 
     } 

     // new shared cleanup logic 
     disposed = true; 
    } 

    base.Dispose(disposing); 
} 

Bạn kết thúc với các phương thức Finalizer/Dispose() đơn giản chết và Dispose (bool) có thể kiểm tra. Không cần ép buộc Hoàn tất hoặc bất kỳ thứ gì sử dụng lớp GC.

+0

Vâng, tôi đang làm nó khá như thế. Nó chỉ là một chút thích nghi của những gì được đề nghị trong MSDN. –

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