2012-07-10 40 views
12

Mã thử nghiệm sử dụng WeakReference không thành công cho tôi khi sử dụng Mono 2.11.3 (SGen) cũng như phiên bản 2.10.8 ổn định. Trong một mã đơn giản như thế nàyHành vi WeakReference lạ trên Mono

object obj = new object(); 
WeakReference wr = new WeakReference(obj); 

Assert.IsTrue(wr.IsAlive); 

obj = null; 
GC.Collect(); 

Assert.IsFalse(wr.IsAlive); 

xác nhận thứ hai sẽ không thành công. Thêm GC.WaitForPendingFinalizers không giúp ích gì. Đây có phải là lỗi trong Mono hay trong đầu tôi không? Cảm ơn

+1

Nếu nó là một lỗi trong đầu của bạn, bạn có thể gỡ lỗi từ xa bằng cách gắn PsychicDbg, nhưng chấm dứt phiên có thể gây tử vong. – Polyfun

+4

Có liên quan: [GC.Collect \ (\) CLR <> Mono difference.] (Http://mono.1490590.n4.nabble.com/GC-Collect-CLR-lt-gt-Mono-difference-td1536244.html) Tôi mất hiểu khoảng 2/3 con đường xuống :) – AakashM

Trả lời

10

Nó không phải là lỗi, mà là một chi tiết triển khai trong đó Mono GC hoạt động khác với MS GC. Trong trường hợp này, vì bạn đã tạo đối tượng obj trong cùng một khung ngăn xếp, nó sẽ xảy ra để được giữ bởi mã quét ngăn xếp bảo thủ. Trong mã thực (như trái ngược với các trường hợp kiểm tra tầm thường như thế này) đây không phải là một vấn đề. Nếu đối với trường hợp cụ thể của bạn đó là, tôi khuyên bạn nên bố trí các đối tượng và WeakReference của nó trong một phương pháp riêng biệt:

static WeakReference Alloc() 
{ 
    return new WeakReference (new object()); 
} 
+0

đã làm các trick, nhờ – actionresult

0
[MethodImpl((MethodImplOptions.NoInlining)] 
static WeakReference Alloc() 
{ 
    return new WeakReference (new object()); 
} 

Phải đảm bảo Alloc() phương pháp không được inline khi biên dịch

+1

Câu trả lời này không thực sự trả lời câu hỏi của OP. Xem xét thêm một số giải thích cho câu trả lời của bạn. – Clijsters