Многопоточное небольшое приложение и логирование - PullRequest
0 голосов
/ 03 февраля 2012

У меня здесь небольшой вопрос.Я написал небольшое многопоточное приложение, которое мало что делает, просто подключается к какому-либо ресурсу, читает несколько полей, записывает их в журнал и все.Что я хотел бы знать, если все регистрируется или нет.Вот код для ведения журнала:

private TextWriter textWriter;
private TextWriter errorWriter;

public Logger(string filePath, string errorLogFile)
{
    textWriter = TextWriter.Synchronized(File.AppendText(filePath));
    errorWriter = TextWriter.Synchronized(File.AppendText(errorLogFile));
}

public void WriteToLog(string text)
{
    textWriter.WriteLine(text);
}
    ...

Итак, если, скажем, у меня есть 100 потоков, это будет управлять всеми данными, записываемыми в журнал, или пропустит некоторые потоки?Я создам экземпляр logger в main и передам его исполнителю:

        for (int i = 0; i < threadNumber; i++)
        {
            Executor executor = new Executor(logger)
        }

1 Ответ

6 голосов
/ 03 февраля 2012

Пропуск не происходит. Ваш код является потокобезопасным.
Вы используете TextWriter.Synchronized для создания многопоточной оболочки для записи в ваш файл. Синхронизированный TextWriter реализован с использованием атрибута [MethodImpl(MethodImplOptions.Synchronized)], который в основном аналогичен блокировке экземпляра, в котором содержится этот метод.
Это означает, что блокировка, которая происходит, заставляет все остальные потоки ждать, пока один поток, который в данный момент пишет, не завершит свою работу.
Лучшим подходом было бы создать класс, который содержит потокобезопасную неблокирующую очередь , в которую вы помещаете свои записи журнала, и один поток, который обрабатывает их и помещает их в файл журнала. Если в вашем приложении происходит много журналирования, это, скорее всего, повысит производительность.

...