.Net, bir eşzamanlı olmayan bir işlemi başlatan bir nesneyi örnekle (yöntemlerinden birinde Delegate.BeginInvoke kullanarak) farz edelim, daha sonra nesneyi null olarak atayarak veya kapsam dışına çıkmasına izin vererek nesneyi terk edin. Zaman uyumsuz süreç devam ederken Çöp Toplayıcısı nesneyi toplamaya çalışır mı? Değilse, nesneyi toplamasını engelleyen nedir?.NET GC, bir yöntemi zamanuyumsuz olarak yürüten, terk edilmiş bir nesne ile uğraşacak mı?
5
A
cevap
12
Tamamen yönetilen koddaysanız, toplanmaz.
Ateşlediğiniz delege, nesnenin bir parçasıdır (açıklamanızdan). Çalıştığı sürece, nesneye aktif bir referans var. Temsilci tamamlandığında, nesne koleksiyon için bir aday olacaktır. Ancak, yerel delege temsilci içinde çağırıyorsanız, nesnenin yerel kod tamamlanmadan önce gerçekten sonlandırılabileceği bazı durumlar vardır. Ayrıntılar için, bu MSDN forum thread'a bakın.
Harika, tamamen anlamlıdır. Şimdi bunun üzerinde biraz genişletmem gerek. AsyncCallback'i BeginInvoke'a ilettim, böylece bazı kesinleştirme işlemlerini yapabilir ve senkronize olmayan işlem tamamlandığında EndInvoke'u arayabilirim. Bu AsyncCallback tamamlanana kadar delege çağrısının tamamlanmadığı doğru mu? Ve böylece nesne AsyncCallback sona erene kadar koleksiyon için aday olmayacak? –
Evet. Bkz. Http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.asyncresult_members.aspx - Temsilcinizin ve dolayısıyla nesnenizin AsyncDelegate özelliğinde bir tanıtıcısı vardır. Geri aranmanız sona erene kadar, bu GC için aday olmayacaktır. –
Mükemmel, çok beğenilen. –