Вызванное исключение в случае параллельного доступа к файлам с помощью StreamReader
Я нашел сообщение об обработке параллельного доступа к файлам с помощью 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 + для параллелизма в процессе
- Да, я действительно хочу, чтобы все журналы были записаны в один и тот же файл
1 ответ:
Это будет
IOException
с текстом:"процесс не может получить доступ к файлу' {0}', поскольку он используется другим процессом."
Это упрощенный подход:
static bool LogError(string filename, string log) { const int MAX_RETRY = 10; const int DELAY_MS = 1000; // 1 second bool result = false; int retry = 0; bool keepRetry = true; while (keepRetry && !result && retry < MAX_RETRY ) { try { using (StreamWriter file = new StreamWriter(filename, true)) { // write the line file.WriteLine(log); // success result = true; } } catch (IOException ioException) { Thread.Sleep(DELAY_MS); retry++; } catch (Exception e) { keepRetry = false; } } return result; }