C # StreamWriter - при копировании памяти обнаружено вероятное состояние гонки ввода-вывода - PullRequest
0 голосов
/ 23 ноября 2018

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

Только после того, как я получил следующую ошибку: enter image description here

Ссылочная строка:

    swLogger.WriteLine(newLines);

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

Поскольку это произошло только один раз, я не смог воспроизвести проблему.

Сказав это, если мое понимание проблемы не ошибочно, можно было бы решить проблему с помощью lock инструкция, охватывающая всю процедуру?

Код:

public static bool WriteLog(string newLines, bool AddDateTime = true, bool ShowMessageBox = false)
{

    try
    {

        long max = MaxLogSizeMB * 1024 * 1024;

        if (lenTot > max)
        {
            if (swLogger != null)
                swLogger.Close();
            File.Delete(FileName);
            swLogger = new StreamWriter(FileName);
            lenTot = 0;
        }

        if (AddDateTime)
            newLines = "[" + DateTime.Now.ToString("dd/MM/yy HH:mm:ss.fff") + "] " + newLines;
            lenTot += newLines.Length + 2;//Environment.Newline
            swLogger.WriteLine(newLines);<-----

            return true;
        }
        catch (Exception exc)
        {
            return false;
        }
    }

Таким образом, поток регистратора открывается в начале, записывается все время и закрывается в конце.

Заранее спасибо за любую помощь

Патрик

1 Ответ

0 голосов
/ 23 ноября 2018

Да, общая блокировка будет работать, но она будет блокировать вызывающего абонента во время получения блокировки, и на время блокировки другие потоки будут блокировать попытки получить блокировку;это может повлиять на производительность.Вы можете обойти это, имея выделенный поток, который записывает в файл из очереди элементов, подлежащих регистрации, и добавляет в очередь только новые элементы из вызывающего потока.Как только вы начнете все усложнять, вам гораздо лучше использовать готовую библиотеку журналов, такую ​​как log4net, которая сделает все это за вас.

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