Tôi đang sử dụng đối tượng COM từ .NET bằng cách sử dụng interop. Đối tượng cơ bản lấy dữ liệu từ ổ cắm và kích hoạt một số sự kiện cho lớp .NET để xử lý. Tuy nhiên, sau một thời gian, đối tượng COM ngừng kích hoạt các sự kiện được tiết lộ sau đó bởi vì nó được GC thu thập.Đối tượng COM này có bị thu gom rác không?
Cấu trúc của mã nguồn tương tự như một dưới đây:
static void Main(string[] args)
{
MyEventGen gen = new MyEventGen();
WeakReference wr = new WeakReference(gen);
gen.ReceiveDataArray +=
new _IMyEventGenEvents_ReceiveDataArrayEventHandler(gen_ReceiveDataArray);
while (true)
{
Thread.Sleep(1000);
Console.WriteLine(wr.IsAlive);
}
}
static void gen_ReceiveDataArray(ref Array indices, ref Array values)
{
// do nothing
}
Những gì tôi biết cho đến nay:
Từ những gì tôi hiểu, đối tượng
gen
shouldn không được thu gom rác theo bất kỳ cách nào. Vì đối tượng vẫn hoạt động trong phạm viMain
. Nhưng kết quả cho đến nay cho thấy rằng đối tượng được thu thập bởi GC.Đối tượng chỉ được thu gom rác khi được xây dựng dưới dạng Nhả và chạy mà không cần gỡ lỗi. Chạy Debug xây dựng/chạy cả hai chế độ theo trình gỡ lỗi là tốt.
Chương trình sẽ in chữ "False" đầu tiên chính xác sau Bộ sưu tập đầu tiên của bộ sưu tập # 0.
Bằng cách truy cập đối tượng trong vòng lặp
while
, ví dụ:Console.WriteLine(gen.ToString())
, ngăn không cho nó bị GC!Bằng cách thêm một trường tĩnh khác là
Program
lớp để giữ tham chiếu của nó cũng ngăn không cho GC.Đang thử với tải dữ liệu khác nhau, tôi nhận thấy GC chỉ thu thập đối tượng khi Private byte đạt ngưỡng trên ~ 3X MB.
Kiểm tra với CLRProfiler, đối tượng được đề cập là GC bị nghi ngờ.
Tôi đã bỏ lỡ một số khái niệm quan trọng của .NET GC chưa? Có thể có được lý do cho đối tượng là GC'd? Đây có phải là một lỗi GC đã biết không?
Tôi đang sử dụng VS 2008 + .NET 3.5 SP1. Đánh giá cao suy nghĩ của bạn. Cảm ơn!
Cảm ơn Darin! Có vẻ như tôi hiểu lầm quá trình GC tất cả những năm này: ') – Gant
@ m3rLinEz, điều ở chế độ Release nhiều tối ưu hóa được thực hiện và GC có thể trở nên thực sự tích cực. Nó có khả năng hiểu rằng biến 'gen' không còn được sử dụng sau lần truy cập cuối cùng và nó được thu thập. Giữ gen như một biến tĩnh nên ngăn chặn điều này xảy ra. –