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?
5
A
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.
Các vấn đề liên quan
- 1. Phương thức Akka onReceive có thực hiện đồng thời không?
- 2. Gọi một phương thức không đồng bộ từ một phương pháp không đồng bộ
- 3. Thực hiện bỏ phiếu dài theo cách không đồng bộ
- 4. Có phải chờ đợi thực hiện phần còn lại của phương thức không đồng bộ không?
- 5. Vấn đề gỡ rối Xcode và ARC (bỏ qua dealloc)
- 6. Làm thế nào để vứt bỏ các đối tượng có các phương thức không đồng bộ được gọi là?
- 7. Xác thực tham số theo phương thức không đồng bộ
- 8. Có cách nào để bỏ qua mã jQuery/Backbone/Underscore, khi bước qua JS với trình gỡ rối không?
- 9. Cách tạo phương thức không đồng bộ
- 10. Phương thức đồng bộ hóa đối tượng được gọi từ một khối mã không đồng bộ. Ngoại lệ trên Mutex.Release()
- 11. Các hợp đồng mã cho .NET 3.5 gây rối lên trình gỡ lỗi VS10
- 12. Đang chờ phương thức không đồng bộ
- 13. Cách thực hiện một cuộc gọi phương thức không đồng bộ rất đơn giản trong vb.net
- 14. Đối tượng COM này có bị thu gom rác không?
- 15. javascript: thực hiện một loạt các phương pháp không đồng bộ với một cuộc gọi lại
- 16. Gói một loạt các cuộc gọi không đồng bộ với một phương thức đồng bộ với giá trị trả về
- 17. Có thể Automapper bỏ qua các phương thức void không?
- 18. Nếu phương thức được đồng bộ hóa gọi phương thức không đồng bộ khác, có khóa trên phương thức không đồng bộ
- 19. Trình gỡ rối Python có thực hiện bước trong máy phát không?
- 20. Có thể gọi phương thức nội bộ từ một phương thức động trong .NET không?
- 21. Có thể sử dụng bộ khởi tạo đối tượng C# với phương thức nhà máy không?
- 22. Bỏ qua trình xác thực .NET nếu phần tử bị ẩn (hiển thị: không)
- 23. Unity có thể được thực hiện để không đồng bộ hóa bất cứ lúc nào?
- 24. Trình gỡ rối JS có treo toàn bộ vòng lặp sự kiện JS không?
- 25. WeakHashMap có bị xóa trong toàn bộ GC không?
- 26. Có an toàn khi gọi phương thức được đồng bộ từ một phương thức được đồng bộ khác không?
- 27. Có cách nào chung để đồng bộ hóa một phương pháp không đồng bộ không?
- 28. Trong C# .NET, thực hiện thao tác không đồng bộ có nhất thiết phải tạo một chuỗi chặn không?
- 29. hai phương thức đồng bộ khác nhau của cùng một đối tượng?
- 30. Đợi phương thức không đồng bộ void
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? –
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. –
Hoàn hảo, được đánh giá cao. –