Регистратор пишет в файл из строя - PullRequest
0 голосов
/ 02 октября 2019

У меня есть система регистрации, которая состоит из двух статических классов. Первый класс выполняет простую проверку bool, чтобы определить, должен ли он регистрироваться в файле, а затем создает новую задачу, которая вызывает метод другого статического класса для фактической записи в файл.

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

Моя главная цель - не блокировать поток GUI во время регистрации и сделать его быстрым.

Вот относительный код в моем первом классе:

private static readonly string exePath = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly()?.Location) + "\\" + "AppLog" + DateTime.Now.ToString("dd-M-yyyy--HH-mm-ss") + ".txt";
public static bool doWrite= true; //on by default

public static void Log(string msgToLog)
{
    if (!doWriteToFile)
    {
        return;
    }

    Task.Run(() => { LogMessage(msgToLog); } );
}

private static void LogMessage(string msgToLog)
{
    FileWriter.WriteToFileThreadSafe(exePath, msgToLog);
}

Ивот мой FileWriter класс:

public static class FileWriter
{
    private static readonly ReaderWriterLockSlim ReadWriteLock = new ReaderWriterLockSlim();

    public static void WriteToFileThreadSafe(string filePath, string text)
    {
        // Set Status to Locked
        ReadWriteLock.EnterWriteLock();
        try
        {
            // Append text to the file
            using (StreamWriter sw = File.AppendText(filePath))
            {
                sw.WriteLine(text);
            }
        }
        finally
        {
            // Release lock
            ReadWriteLock.ExitWriteLock();
        }
    }
}

Дополнительная информация:

Существуют определенные функции, которые при вызове пользователь хочет во что бы то ни стало войти. Иногда эти функции вызываются тысячи раз за несколько секунд.

1 Ответ

0 голосов
/ 03 октября 2019

Включите поле ThreadId в шаблон регистрации. Если есть пользовательский интерфейс, где ваш пользователь проверяет журналы, вы можете выделить журналы с различным форматированием для каждого ThreadId, чтобы определить, когда поток выполнял свою работу, пока основной поток был приостановлен.

...