2013-05-27 18 views
10

Ben, I (WeakReferences kullanarak) emin bazı nesneler artık başvurulan değildi yapmak için testler koşuyordu .NET 4.x WeakReferences ile ilgili bir sorun var ve ben davranış çerçeve sürümleri arasında tutarlı değildir fark ettik:Tam çöp toplama .NET 4.x'te nasıl zorlanır?

using System; 
using System.Text; 
using NUnit.Framework; 

[TestFixture] 
public class WeakReferenceTests 
{ 
    [Test] 
    public void TestWeakReferenceIsDisposed() 
    { 
     WeakReference weakRef = new WeakReference(new StringBuilder("Hello")); 

     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.WaitForFullGCComplete(); 
     GC.Collect(); 

     var retrievedSb = weakRef.Target as StringBuilder; 
     Assert.That(retrievedSb, Is.Null); 
    } 
} 

Sonuçlar:

.NET 2.0 PASS 
.NET 3.0 FAIL 
.NET 3.5 PASS 
.NET 4.0 FAIL 
.NET 4.5 FAIL 

bu yerde belgelenen mı?

GC'yi bu başvuruyu .NET 4.5'te toplamaya zorlamanın bir yolu var mı?

Şimdiden teşekkürler.

+4

Sadece bir not: GC ayıklama modunda ulaşılamaz nesneleri toplamaz ben Debug.Assert için basit çağrı ile testini değiştirirseniz kod çerçevesinin tüm sürümleri için benim makine üzerinde çalışıyor. – 2kay

+0

Teşekkür ederiz – Guillaume86

+0

Hmm içine bakacağım, gördüğünüz kod çerçevenin tüm sürümlerinde bana çalışır. (Eh, NUnit yüklü değil, ben sadece 'Debug.Assert' kullanıyorum ama bu davranışını değiştirmemeliyim.) –

cevap

6

Burada sorun NCrunch ile ilgilidir.

using System; 
using System.Text; 
using System.Diagnostics; 

public class WeakReferenceTests 
{ 
    public void TestWeakReferenceIsDisposed() 
    { 
     WeakReference weakRef = new WeakReference(new StringBuilder("Hello")); 

     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.WaitForFullGCComplete(); 
     GC.Collect(); 

     var retrievedSb = weakRef.Target as StringBuilder; 
     Debug.Assert(retrievedSb == null); 
    } 
} 
+0

Teşekkürler, enstrüman montajlarının NCrunch olduğunu, seçeneği devre dışı bıraktım ve geçtim. – Guillaume86

+0

Bunu tamamlamaya çalışıyorum, ancak başvurum Silverlight 4 üzerine kurulu ve WaitForFullGCComplete seçeneğim yok. SL5'te olur mu? –

0

@ Cody Gray'e teşekkürler (yorumlara bakın), bunu çözdüm.

Testlerimi yürütmek için NCrunch kullanıyorum ve bu davranışı üreten çıkış tertibatını çalıyordum (çıktı enstrümantasyonunu devre dışı bırakmak, tüm platformlarda test geçişini devre dışı bırakıyor).