2014-09-16 4 views
0

Я разрабатываю класс для записи журналов. он записывается с помощью функции «StreamWriter.WriteLine()».Нужно ли функции "StreamWriter.WriteLine()" блокировать() "?

logStream.WriteLine(msgWrite); 
logStream.Flush(); 

некоторые различные темы, использовать этот класс, чтобы писать журналы, в одном текстовом файле (файл журнала является общим для всех потоков) сделать это нужно заблокировать функцию()?

Должен ли я изменить свой код?

lock(syncObj) 
{ 
    logStream.WriteLine(msgWrite); 
    logStream.Flush(); 
} 

, пожалуйста, помогите мне.

+0

Должен быть это звено в двух экземплярах, вероятно: http://stackoverflow.com/questions/3591297/thread-safe-streamwriter- c-sharp-how-to-do-it-2 – zerkms

+0

Также уместно: http://blogs.msdn.com/b/csharpfaq/archive/2010/08/12/blocking-collection-and-the-producer-consumer -problem.aspx – zerkms

ответ

2

Вы должны обернуть свой писатель в TextWriter.Synchronized, который, как предлагает этот документ, гарантирует, что все результирующие операции записи выполняются поточно-безопасным способом.

Кроме того, да, вы могли бы просто использовать lock, чтобы сделать это, но когда есть встроенные функции, подобные этому, я предпочитаю это.

Быстрая и грязная реализация может выглядеть следующим образом:

public static class Logs 
{ 
    static Logs() 
    { 
     _Writer = TextWriter.Synchronized(new StreamWriter(path)); 
    } 

    private static TextWriter _Writer; 

    static void LogLine(string line) 
    { 
     _Writer.WriteLine(line); 
    } 
} 
+1

Безопасность потока WriteLine' зависит от реализации, но если вы посмотрите на текущий источник для StreamWriter и его базы ('TextWriter'), определенно не рекомендуется называть' WriteLine (строка) 'одновременно, так как он в конечном счете записывает символы строки один за другим в цикле. –

Смежные вопросы