У меня есть система регистрации, которая состоит из двух статических классов. Первый класс выполняет простую проверку 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();
}
}
}
Дополнительная информация:
Существуют определенные функции, которые при вызове пользователь хочет во что бы то ни стало войти. Иногда эти функции вызываются тысячи раз за несколько секунд.