2009-05-14 17 views
5

Trong .Net, giả sử tôi khởi tạo một đối tượng bắt đầu một quá trình không đồng bộ (sử dụng Delegate.BeginInvoke trên một trong các phương thức của nó), sau đó từ bỏ đối tượng bằng cách đặt tham chiếu đến nó thành null hoặc cho phép nó vượt ra ngoài phạm vi. Garbage Collector có cố gắng thu thập đối tượng trong khi tiến trình không đồng bộ đang được tiến hành không? Nếu không, điều gì ngăn cản nó thu thập vật thể?Trình gỡ rối .NET GC với đối tượng bị bỏ qua có thực hiện một phương thức không đồng bộ không?

Trả lời

12

Nếu bạn đang ở trong mã được quản lý hoàn toàn, mã sẽ không thu thập.

Đại biểu bạn đang kích hoạt là một phần của đối tượng (từ mô tả của bạn). Miễn là nó đang chạy, có một tham chiếu hoạt động cho đối tượng. Ngay khi đại biểu hoàn thành, đối tượng sẽ trở thành một ứng cử viên cho bộ sưu tập.

Tuy nhiên, nếu bạn đang gọi vào mã gốc trong đại biểu, có một số trường hợp đối tượng thực sự có thể được hoàn thành trước khi mã gốc hoàn tất. Để biết chi tiết, hãy xem điều này MSDN forum thread.

+0

Tuyệt vời, có ý nghĩa tổng thể. Tôi cần phải mở rộng một chút về điều này ngay bây giờ mặc dù. Tôi đã thông qua một AsyncCallback đến BeginInvoke để tôi có thể thực hiện một số xử lý hoàn tất và gọi EndInvoke khi quá trình không đồng bộ hoàn tất. Có đúng là cuộc gọi đại biểu không hoàn thành cho đến sau khi AsyncCallback này hoàn tất? Và do đó đối tượng sẽ không trở thành một ứng cử viên cho bộ sưu tập cho đến sau khi AsyncCallback kết thúc? –

+0

Có. Xem http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.asyncresult_members.aspx - có một xử lý cho đại biểu của bạn, và do đó đối tượng của bạn, trong thuộc tính AsyncDelegate. Cho đến khi kết thúc cuộc gọi lại của bạn, điều này sẽ không phải là một ứng cử viên cho GC. –

+0

Hoàn hảo, được đánh giá cao. –

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