Мультиориентированный на многопотоковое исполнение вход

Классический пример исключений, которые вползают во все, когда Вы используете размер небольшой выборки. Рефакторинг огромного if-elseif-else блока в защитное расположение пункта делает код намного более читаемым, но, как Вы говорите при применении тех же правил к синглу, если еще это не столь полезно. Я сказал бы даже, что это было (небольшое) отсутствие предвидения resharper devs для не перескакивания через очень маленькие блоки, такие как это, но это достаточно безопасно.

8
задан Rene Schulte 5 October 2009 в 10:09
поделиться

2 ответа

Я написал несколько модульных тестов, чтобы воспроизвести проблему: тест создает 50 потоков, и каждый поток регистрирует 500 сообщений. После этого были подсчитаны написанные строки, и в результате у меня получилось 25000 (50 х 500) строк в разном порядке. Я тестировал его на двухъядерном и на восьмиъядерном компьютере.
Я тестировал статический регистратор:

private static ILog StaticLog = log4net.LogManager.GetLogger(RepositoryName, "Static logger");

и с регистратором для каждого экземпляра тестового класса / потока:

ILog instanceLog = LogManager.GetLogger(RepositoryName, "Instance logger: " + ThreadId.ToString());


И все тесты были зелеными.

Итак, Log4Net отлично работает и хорошо справляется со сценариями многопоточности. Документы Appender должны быть обновлены, и в них должно быть указано, что многопоточные операции поддерживаются, если Logger API используется правильно.

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

Спасибо за помощь!

15
ответ дан 5 December 2019 в 07:12
поделиться

Я никогда не использовал FileAppender и не могу сказать, является ли он потокобезопасным, но у меня никогда не было проблем с RollingFileAppender . В документации указано, что члены типа не являются потокобезопасными, но это должно быть нормально, если вы не попытаетесь напрямую писать в приложение. Вам не нужно добавлять свой собственный код блокировки вокруг таких вызовов, как:

log.Info("message");
8
ответ дан 5 December 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: