c# Класс FileLogTraceListener выдает исключение при изменении даты - PullRequest
0 голосов
/ 16 апреля 2020

Мое приложение-служба использует класс FileLogTraceListener для ведения журнала и установки LogFileCreationScheduleOption.Daily. Я использую 10 потоков для вызова writeline и flu sh, всего go noraml. Но когда я изменяю дату (это создаст новый файл журнала), он выдает исключение io, как фотографию.

Я думаю, что это ошибка при вызове функции CloseCurrentStream () Класс FileLogTraceListener не может сделать многопоточную безопасную, а m_Stream устанавливает ноль при изменении даты.

введите описание изображения здесь

обновление 2020/04/22

Вам нужно добавить ссылки "Microsoft.VisualBasi c", чтобы построить проект

, используя следующий класс: System.Collections, System.IO, System.Text, System.Threading, Microsoft.VisualBasi c .Logging .

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("start");
        Tracelog.StartTrace();

        for (int i = 0; i < 10; i++)
        {
            Thread backthread = new Thread(new ThreadStart(Worker));
            backthread.Start();
        }            
    }

    public static void Worker()
    {
        while (true)
        {
            //Console.WriteLine("start");
            Tracelog.Trace(Tracelog.INFO, "test");
            //Thread.Sleep(10);
        }
    }
}

public class Tracelog
{
    public static int INFO = 0;
    public static int ERROR = 1;

    public static FileLogTraceListener myListener;

    //private static readonly object Lock = new object();

    public static void StartTrace()
    {
        try
        {
            //lock (Lock)
            {
                myListener = new FileLogTraceListener("myListener");
                myListener.LogFileCreationSchedule = LogFileCreationScheduleOption.Daily;
                myListener.CustomLocation = "log";
                myListener.BaseFileName = "log";
                myListener.MaxFileSize = 10 * 1024 * 1024;
                myListener.WriteLine("Trace start");
                myListener.Flush();
            }

        }
        catch (Exception e)
        {
            Console.WriteLine("StartTrace error" + e.ToString());
        }
    }

    public static void Trace(int type, string message)
    {
        try
        {
            //lock (Lock)
            {
                myListener.WriteLine(message);
                myListener.Flush();
            }


        }
        catch (Exception e)
        {
            Console.WriteLine("Trace error message:" + e.ToString());
        }
    }
}
...