Мое приложение-служба использует класс 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());
}
}
}