Файл, используемый другим процессом - StreamWriter - PullRequest
0 голосов
/ 22 февраля 2019

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

private async void button1_Click(object sender, EventArgs e)
{
    await Task.Run(() => LoggerTest());
}

private async void button2_Click(object sender, EventArgs e)
{
    await Task.Run(() => LoggerTest());
}

private async void LoggerTest()
{
    for (int i = 0; i < 10000; i++)
    {
        Logger.Log(string.Format("Counter: {0}", i));
        Thread.Sleep(10);
    }
}

В методе журнала используется StreamWriter

private void Log(string log)
{
    if (!IsFileLocked(fullPath))
    {
        using (StreamWriter file = new StreamWriter(fullPath, append: true))
        {
            file.WriteLine(log);
            file.Close(); // I know this is unnecessary in the using block
        }
    }
}

private bool IsFileLocked(string file)
{
    try
    {
        using (var stream = File.OpenRead(file))
            return false;
    }
    catch (IOException)
    {
        return true;
    }
}

Когда я нажимаю кнопку 1 и кнопку 2, нижеобнаружено исключение:

System.IO.IOException : «Процесс не может получить доступ к файлу« C: .. \ x.txt », так как он используется другим процессом. '

1 Ответ

0 голосов
/ 22 февраля 2019

попробуйте что-то вроде этого

 private static readonly object locker = new object();
lock (locker)
            {
                using (FileStream fileStream = new FileStream("FilePath"), FileMode.Append))
                {
                    using (StreamWriter writer = new StreamWriter(fileStream))
                    {
                        writer.WriteLine(log);
                    }
                }
            }

ключевое слово lock заблокирует потоковую запись до завершения текущего процесса записи

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