Я нашел сообщение , в котором говорится об обработке одновременного доступа к файлам с помощью StreamWriter .
Проблема в том, что ответы управляют не сценарием, к которому осуществляется доступ к файлу, а несколькими процессами.
Скажем коротко:
- У меня есть несколько приложений
- Мне нужна централизованная система регистрации в базе данных
- Если сбой базы данных, мне нужен запасной вариант в журнале файловой системы
Существует известный сценарий параллелизма, когда несколько приложений (процессов) будут пытаться записать в этот файл.
Это можно сделать, повторив попытку записи после небольшой задержки.
Но я не хочу повторных попыток, если это ошибка безопасности или синтаксическая ошибка имени файла.
Код здесь:
// true if an access error occured
bool accessError = false;
// number fo writing attemps
int attempts = 0;
do
{
try
{
// open the file
using (StreamWriter file = new StreamWriter(filename, true))
{
// write the line
file.WriteLine(log);
// success
result = true;
}
}
/////////////// access errors ///////////////
catch (ArgumentException)
{
accessError = true;
}
catch (DirectoryNotFoundException)
{
accessError = true;
}
catch (PathTooLongException)
{
accessError = true;
}
catch (SecurityException)
{
accessError = true;
}
/////////////// concurrent writing errors ///////////////
catch (Exception)
{
// WHAT EXCEPTION SHOULD I CATCH HERE ?
// sleep before retrying
Thread.Sleep(ConcurrentWriteDelay);
}
finally
{
attempts++;
}
// while the number of attemps has not been reached
} while ((attempts < ConcurrentWriteAttempts)
// while we have no access error
&& !accessError
// while the log is not written
&& !result);
Мой единственный вопрос - тип исключения , который будет возникать в случае записи параллелизма. Я уже знаю, что все можно сделать по-другому. Позвольте мне добавить несколько соображений:
- Нет, я не хочу использовать NLog в этом сценарии
- Да, я обрабатываю параллелизм с IOC + Mutex для параллелизма в процессе
- Да, я действительно хочу, чтобы весь журнал записывался в одном файле