У меня есть очередь, в которую я добавляю свое сообщение, в которое я вхожу, с помощью метода Log (содержимое строки). У меня есть другой метод, который я запускаю в фоновом потоке, который постоянно читает очередь и записывает в файл. Отметки времени сохраняются, даже если запись может быть выполнена после того, как будет получено слишком много данных.
Метод ведения журнала является статическим и общедоступным, поэтому его можно вызывать из любого потока. Я не могу гарантировать, что этот код компилируется, потому что я вырвал его из своего проекта и удалил некоторые вещи.
Я обнаружил, что я не получаю повышения производительности при записи более 1 или 2 потоков, потому что мой компьютер DISK I / O Sucks. Возможно, вам удастся ускорить это, если вы разбили свою запись на несколько файлов, хотя точно сказать не могу.
private static StreamWriter sw;
private static Queue<string> logQueue = new Queue<string>();
public static string logLock = "";
public static void LogLoop()
{
sw = new StreamWriter("logFilePath.log"), true);
sw.AutoFlush = true;
while (true)
{
while (logQueue.Count > 0)
{
string s = "";
lock (logLock) // get a lock on the queue
{
s = logQueue.Dequeue();
}
sw.WriteLine(s);
}
Thread.Sleep(10);
}
}
public static void Log(string contents)
{
contents = DateTime.Now.ToString("MM-dd-yy - HH:mm:ss ffff") + " - " + contents; // add a timestamp
lock (logLock) // get a lock on the queue
{
logQueue.Enqueue(contents);
}
}
Так я запускаю метод фонового потока.
Thread logThread = new Thread(LogLoop);
logThread.IsBackground = true;
logThread.Name = "Logging Thread";
logThread.Start();