c# Запись текста в один текстовый файл из нескольких потоков - PullRequest
1 голос
/ 10 июля 2020

У меня есть exe, который вызывается несколько раз в секунду, и внутри этого exe есть функция, которая записывает в текстовый файл в виде журнала.

Это мой класс ведения журнала:

public static class Log
{
    private static ReaderWriterLockSlim lock_ = new ReaderWriterLockSlim();
    public static void Output(string Input)
    {
        string MyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        string logPath = @MyDocuments + "\\SCV";
        lock_.EnterWriteLock();
        Directory.CreateDirectory(logPath);
        string logFilePath = @logPath+"\\SCVLog -" + DateTime.Today.ToString("MM-dd-yyyy") + "." + "txt";
        FileInfo logFileInfo = new FileInfo(logFilePath);
        DirectoryInfo logDirInfo = new DirectoryInfo(logFileInfo.DirectoryName);
        if (!logDirInfo.Exists) logDirInfo.Create();
        try
        {
            using (FileStream fileStream = new FileStream(logFilePath, FileMode.Append))
            {
                using (StreamWriter log = new StreamWriter(fileStream))
                {
                    log.WriteLine(Input);
                }
            }
        }
        finally
        {
            lock_.ExitWriteLock();
        }
    }
}

Я называю это так:

Log.Output(finalFile + " processed");

Кажется, что класс ведения журнала является потокобезопасным, однако я все равно получаю эту ошибку:

Процесс не может получить доступ файл, потому что он используется другим процессом

Что еще мне нужно сделать, чтобы сделать этот поток безопасным?

1 Ответ

1 голос
/ 10 июля 2020

Я не уверен, как работает ваш процесс блокировки, но если вы замените

new FileStream(logFilePath, FileMode.Append)

на

new FileStream(logFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)

, я бы подумал, что ваш lock_ не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...