Bu konuyla ilgili birçok tartışma oldu ve herkes bir bellek sızıntısını önlemek için her zaman Delegate.EndInvoke'yi aramanız gerektiğine katılıyor (Jon Skeet söyledi!).Çağırma Delegate.EndInvoke bellek sızıntısına neden olabilir ... efsane?
Her zaman bu yönergeyi sorgulamadan takip ettim, ancak yakın zamanda kendi AsyncResult sınıfımı uyguladı ve sızıntıya neden olabilecek tek kaynağın AsyncWaitHandle olduğunu gördüm.
(Aslında WaitHandle tarafından kullanılan yerel kaynak, bir Finalizer'a sahip bir SafeHandle içinde kapsüllenmiş olduğu için gerçekten sızıntı yapmaz, yine de çöp toplayıcısının son haline getirme kuyruğuna baskı ekleyecektir.
Action a = delegate { };
while (true)
a.BeginInvoke(null, null);
bir süre ve bellek için bu koştum: AsyncResult uygulanması sadece bir sızıntı sadece denemek orada olduğunu bilmek
) ... en iyi yolu talep üzerine AsyncWaitHandle başlatır 9-20 MB arasında kal.
en Delegate.EndInvoke çağrıldığında ile karşılaştıralım: garip Bu testte, 9-30 MG arasında hafıza oyun ile
Action a = delegate { };
while (true)
a.BeginInvoke(ar => a.EndInvoke(ar), null);
, ha? (Muhtemelen bir AsyncCallback olduğunda çalıştırılması biraz daha uzun sürdüğü için, ThreadPool'da daha sıraya alınmış delege olacaktır)
Ne düşünüyorsunuz ... "Mit bozuldu"?
P.S. ThreadPool.QueueUserWorkItem Delegate.BeginInvoke bir yüz daha verimli, daha iyi & çağrıları unutmak için kullanmak için.
İyi soru! +1. BTW, çok fazla izlersiniz MythBusters;) – RCIX
Katılıyorum, ThreadPool.QueueUserWorkItem, parlak ve az kullanılan bir yöntemdir. – Anton