• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Логгер

  • Автор темы Автор темы Coder
  • Дата начала Дата начала
C

Coder

Здравствуйте, программисты!

Есть класс, отвечающий за логирование. Он записывает данные в текстовой файл:

class TxtLogger : ILogger
{
protected FileStream f1;
protected string FileName = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\Folder\\Output1.txt";
protected string CurrentLogText;
protected StreamWriter output;
protected Queue lgrMsg = new Queue();

public void Log(string message, MessageType messageType)
{
CurrentLogText = "Message text: " + message + ", " + DateTime.Now.ToString() + ", Type: " + messageType;
lgrMsg.Enqueue(CurrentLogText);

f1 = new FileStream(FileName, FileMode.Append);
output = new StreamWriter(f1);


while (lgrMsg.Count > 0)
{
output.WriteLine(lgrMsg.Dequeue());
}
output.Close();
f1.Close();
}
}

Если метод этого класса вызывается в одном потоке (много раз), всё работает хорошо. Но как только я пытаюсь вызвать его из двух потоков одновременно, выскакивает ошибка (exeption), которая говорит, что текстовой файл используется другим процессом.
Я понимаю, что нельзя одновременно записывать в один файл из двух потоков, поэтому организовал очередь (Queue). Но проблема не решилась.

Прошу помочь, а то уже долго мучаюсь. Спасибо!
 
Сделать Singleton и доступ к нему между потоками через lock распределять ... и файл держать открытым и дописывать в него походу...
 
Если требуется просто писать в лог, можно воспользоваться стандартным классом System.Diagnostics.Trace, его можно заставить писать и в файл. Еще можно взять стороннюю библиотеку типа log4net.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab