2016-04-08 23 views
0

Bazı günlük çıkışını yapabileceği bir tekil benzeri sınıf var: Ben kullandığınızdaFlush StreamWriter

örnek bir programda gibi

class Program 
{ 
    private static void Main(string[] args) 
    { 
     Foo.Instance.Log("asdf\n"); 
    } 
} 

dosyası bu oluşturuluyor, ancak çıktı yazılmıyor. Bunun, StreamWriter'un hiç kızarmadığı için olduğunu farz ediyorum.

~Foo() 
{ 
    os.Close(); 
} 

ama bu ObjectDisposedException verir:

ben ~Foo() içinde Close() için çağırarak sınıfı onarmaya çalıştı. Görünüşe göre Foo'un yıkıcısı çağrıldığında Foo.os zaten imha edilmiştir.

StreamWriter sayfamın "en sonunda" temizlendiğinden nasıl emin olabilirim? this.os.AutoFlush = true; eser Ayar

DÜZENLEME

. Foo'a Flush() yöntemini ekleyerek ve bunu uygun yerlerde çağırmak da işe yaramıyor.

+0

[IDisposable interface] 'ı uygulayın (https://msdn.microsoft.com/en-us/library/system.idisposable (v = vs.110) .aspx) – Steve

+0

Bunu düşündüm, ancak verilen örnekte Dispose() 'aranmayacak. – mkluwe

+0

Bu bir yıkıcıdır. Farklıdır: http: //stackoverflow.com/questions/339063/what-is-the-difference-between-using-idisposable-vs-a-destructor-in-c – Steve

cevap

0

Her şeyden önce, bir singleton kullanmak kendi başına problemler yaratır ve bunun başka bir kanıtı olması gerekmez. İşte, gizlenmiş bir küresel için temizlik. StreamWriter, otomatik sifon programı ucunda ve the documentation göre değil

Tüm verileri doğru yatan akışına yazılır sağlamak için Kapat çağırmalıdır. Bir cevaba

Teşekkür "Self-closing StreamWriter singleton" @PeterDuniho bir olası çözüm yıkıcı Close() arayarak sorunu göz önüne alındığında

private Foo() 
{ 
    this.os = System.IO.File.CreateText("D:/tmp/test"); 
    System.AppDomain.CurrentDomain.ProcessExit += 
     (sender, eventArgs) => this.os.Close(); 
} 

için yapıcı değişen olabilir için, ihmal olmamalıdır " Finalizatörler zaten her yerde çok fazla kullanılmıyor "diye yazıyor. Bu durumda, çöp toplama özel bir sipariş kullanmazsa, StreamWriter nesnesi zaten toplanmış ve yeniden dirilen zombi durumunda kapatılamaz.

0

Flush yöntemine sahip olan StreamWriter'i kullanabilirsiniz.

Yapmaya çalıştığınız şey için başka bir seçenek daha vardır, File.AppendAllText'i kullanabilir ve çalışacaktır. Bu şekilde StreamWriter her zaman açık değildir.

class Foo 
{ 
    private static Foo instance; 
    private System.IO.StreamWriter os; 

    private Foo() 
    { 
     this.os = new System.IO.StreamWriter("D:/tmp/test.txt"); 
    } 

    public static Foo Instance 
    { 
     get 
     { 
      if (instance == null) 
       instance = new Foo(); 
      return instance; 
     } 
    } 

    public void Log(string s) 
    { 
     os.WriteLine(s); 
     os.Flush(); 
    } 

    public void Log2(string s) 
    { 
     System.IO.File.AppendAllText(@"D:/tmp/test2.txt",s); 
    } 
} 
İlgili konular