.NET 4.x Потокозащищенное логирование - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Прошу помощи! Есть проблемы с записью логов в файл: 1. тупо не дописывает часть из коллекции 2. выкидывает исключение что файл занят другим процессом Подскажите пожалуйста как исправить и защититься от подобного.
public class Logger
    {
        
        public static Thread LogWriter;
        public static ConcurrentQueue<string> Rows = new ConcurrentQueue<string>();
        public static string FileName { get; set; }
        public bool Enable { get; set; }
 
        public void Start()
        {
            LogWriter.IsBackground = true;
            LogWriter.Start();
        }
 
        public Logger(Thread thread, string fileName, bool enable)
        {
            LogWriter = thread;
            FileName = fileName;
            Enable = enable;
        }
 
        public static void WriteRow(string log)
        {
            
            Rows.Enqueue(log);
            
        }
 
        public static void WriteLogFile()
        {

            while (true)
            {
                using (StreamWriter file = new StreamWriter(File.Create(FileName)))
                {
                    foreach (string s in Rows)
                        file.WriteLine(s);
                }                
            }
         }
 
        private static string Time()
        {
            return DateTime.Now.ToString();
        }
    }
 
    class Programm
    {
        public static void Work()
        {
            Logger.WriteRow(Guid.NewGuid().ToString());
            Console.WriteLine(Logger.Rows.Count);
        }        
 
        public static void Main()
        {
            new Logger(new Thread(delegate () { Logger.WriteLogFile(); }), "test.txt", true).Start();
 
            for (int i=0; i < 100; i++)
                new Thread(Work).Start();
         }

 }

Решение задачи: «.NET 4.x Потокозащищенное логирование»

textual
Листинг программы
using System;
using System.Windows.Forms;
 
namespace LoggerThread
{
    public partial class Form1 : Form
    {
        private Logger mLogger;
 
        public Form1()
        {
            InitializeComponent();
 
            this.mLogger = new Logger();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            this.mLogger.HandleLog(DateTime.Now.ToLongTimeString());
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.mLogger.Dispose();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5
Похожие ответы