• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Логгер

  • Автор темы 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). Но проблема не решилась.

Прошу помочь, а то уже долго мучаюсь. Спасибо!
 
D

DZX

Сделать Singleton и доступ к нему между потоками через lock распределять ... и файл держать открытым и дописывать в него походу...
 
L

LuMee

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!