Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Логирование


Автор: pa6kevi4 30.6.2010, 00:06
Здравствуйте! Вот сижу уже , мучаюсь с заданием. Срочно нужна ваша помощь.

Нужно чтобы ЭТО запускалось в отдельном потоке. ЧТОБЫ ОСТАЛЬНАЯ ЧАСТЬ ПРОГРАММЫ, ВЫЗЫВАЮЩАЯ ЭТОТ КЛАСС, НЕ ЖДАЛА ЕГО ВЫПОЛНЕНИЯ, А ПРОСТО ПЕРЕДАВАЛА ЕМУ ЗНАЧЕНИЯ.

Код

    public class TxtLogger : ILogger
    {
        private FileStream f1;
        private StreamWriter output;
        protected string FileName = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\Folder\\Output1.txt";
        protected string CurrentLogText;

        protected ThreadStart myThreadDelegate;
        protected Thread thr;

        public TxtLogger()
        {
            f1 = new FileStream(FileName, FileMode.Append);
            output = new StreamWriter(f1);
        }

        public void Log(string message, MessageType messageType)
        {
            lock (this)
            {
                CurrentLogText = "Message text: " + message + ", " + DateTime.Now.ToString() + ", Type: " + messageType;
                output.WriteLine(CurrentLogText);
                f1.Flush();
                output.Flush();
            }
        }
    }



Сверху описано:

Код

        protected ILogger lg1 = new TxtLogger();
        protected ILogger lg2 = new XmlLogger();
        protected ILogger lg3 = new DbLogger();

        protected MessageGenerator[] arr;



Код

                  arr = new MessageGenerator[numberOfGen];
                    
                    for (int c = 0; c < arr.Length; c++)
                    {
                        arr[c] = new MessageGenerator(numberOfGen, mseconds);

                        if (checkBox1.Checked)
                        {
                            arr[c].MessageGeneratedEvent += new MessageGenerator.MyDelegate(lg1.Log);
                        }
                        if (checkBox2.Checked)
                            arr[c].MessageGeneratedEvent += new MessageGenerator.MyDelegate(lg2.Log);
                        if (checkBox3.Checked)
                            arr[c].MessageGeneratedEvent += new MessageGenerator.MyDelegate(lg3.Log);
                        arr[c].go();                      
                    }


 smile 

Автор: pa6kevi4 30.6.2010, 22:35
 smile 

Автор: ZmeyNet 1.7.2010, 04:50
1) где Using? почему он не рядом с FileStream
2) lock (this)  -- не есть гуд самого себя лочить
3) не вижу никакой обработки IO ошибок 


Простое решении  (заметь я не сказал верное) : оберни метод лог и в обертке создавай новый поток.

Решение посложнее : состоит в том , чтобы записывать логи порциями 1 раз в еденицу времени скажем если у тебя множество логов пишется , то логер будет раз в 2-3 секунды или реже проверять наличие входящих сообщений и записывать их.

Автор: Mephisto 4.7.2010, 19:03
Я бы рекомендовал не изобретать велосипед, а воспользоваться готовым решением http://logging.apache.org/log4net/index.html. И время сэкономишь и результат получишь хороший.

Добавлено через 4 минуты и 1 секунду
А если необходимо именно так сделать, то попробуй посмотреть в сторону делегата и BeginInvoke. Только нужно сделать писание потокобезопасным.

Автор: jonie 5.7.2010, 09:11
Mephisto, еще есть System.Diagnostic .... log4net конечно удобен, но "нестандартен"...

Автор: Mephisto 5.7.2010, 15:43
Цитата(jonie @  5.7.2010,  10:11 Найти цитируемый пост)
Mephisto, еще есть System.Diagnostic .... log4net конечно удобен, но "нестандартен"... 

Согласен. Но с System.Diagnostic нужно еще с правами разбираться, особенно если апликуха впервые запускается под правами пользователя в ХР, или в 7-ке с недоадмином. При попытке открыть лог из System.Diagnostic падает. Разве что писать в общак, что не совсем гуд.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)