2012-04-12 8 views
0

ich möchte eine txt-datei in cross-threads erreichen und schreiben, aber software gibt eine ausnahme, weil mehrere threads die gleiche datei gleichzeitig erreichen wollen. Wie kann ich Streamwriter aufrufen, um Ausnahmen zu vermeiden? Hier ist mein Code:C# streamwriter invoke

void WriteLog(string LogStr) 
{ 
    StreamWriter sw = new StreamWriter("Log.txt", true); 
    sw.WriteLine(LogStr); 
    sw.Close(); 
} 

Ich rufe WriteLog-Methode in Threads.

Vielen Dank.

+2

Ist die Verwendung von etwas wie NLog oder log4net nicht in Frage? Dies wird das Problem für Sie lösen, da sie mit all diesen Komplexitäten umgehen. Nebenbei, das Öffnen und Schließen einer Datei jedes Mal, wenn Sie eine Nachricht protokollieren wollen, bereitet Ihnen in Zukunft große Kopfschmerzen. – yamen

Antwort

2

Sie könnten versuchen, einen Mutex zu verwenden:

private Mutex mut = new Mutex(); // Somewhere in mail class 
void WriteLog(string LogStr) 
{ 
    mut.WaitOne(); 
    try 
    { 
     using(StreamWriter sw = new StreamWriter("Log.txt", true)) 
      sw.WriteLine(LogStr); 
    } 
    finally 
    { 
     mut.ReleaseMutex(); 
    } 
} 
0

die Mutex Klasse verwenden:

Mutex mut = new Mutex(); 
+1

Wenn Sie OP nicht zeigen, wie man es benutzt, scheint es unbrauchbar ... – Marco

0

Ich glaube, dass, wenn Sie nicht wollen, für log warten tun (klingt nur logisch) Sie sollten Drücken Sie einfach die Protokollnachricht in eine synchronisierte Warteschlange (verfügbar über .net 4) und lassen Sie einen Hintergrundthread alle Protokollschreibvorgänge behandeln. Wenn Sie Mutex und Sperren verwenden, wird es Ihre Leistung beeinflussen. In der Speicherwarteschlange ist das Schreiben viel schneller als beim Schreiben von Dateien.