WindowsService
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



WindowsService Expand / Collapse
Автор
Сообщение
18.01.2007 12:40
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 26.06.2007 19:18
Сообщ.: 9, Visits: 35
Добрый день..

у меня вот такая проблема я написал сервис который должен писать лог через домустим минуту. вот текст программы:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Diagnostics;

using System.ServiceProcess;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace WindowsService1

{

public partial class Service1 : ServiceBase

{

public Service1()

{

InitializeComponent();

}

protected override void OnStart(string[] args)

{

}

protected override void OnStop()

{

}

private void timer1_Tick(object sender, EventArgs e)

{

fAddErorTextInLog();

}

public static void fAddErorTextInLog()

{

if (!File.Exists(@"C:\ThisError.log"))

{

File.Create(@"C:\ThisError.log");

}

StreamWriter ST = new StreamWriter(@"C:\ThisError.log", true);

ST.WriteLine(DateTime.Now);

ST.Close();

}

}

}

так вот когда я в VS2005 пошагово запускаю всё нормально работает-пишется лог, а когда уже инсталирую как сервис и запускаю то таймер наотрез отказывается работать и лог не пишеться.....

Помогите кто может, я уже не могу решить эту проблему 3 дня, облазил много форумов но там не нашел решение моей проблемы...

Сообщ. #909832
18.01.2007 13:32
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Скорее всего дело в том что надо запускать таймер в методе OnStart (timer1.Enabled = true). Соответственно надо не забыть выключить при остановке сервиса.

Кроме того нет никакой необходимости в проверке существования файла и его создания. Конструктор класс StreamReader сделает это за тебя. Также оберни использование StreamReader в блок using чтобы файл не остался открытым. Метод fAddErorTextInLog тогда будет выглядеть так:

private static void fAddErorTextInLog()
{
    using (StreamWriter ST = new StreamWriter(@"C:\ThisError.log", true))
    {
        ST.WriteLine(DateTime.Now);
    }
}

Обрати внимание на модификатор private. Сомневаюсь что ты будешь вызывать этот метод из других классов, а значит делать его public нет никакого смысла.

И еще небольшая придирка :) От буквы f в начале имени функции нет никакого смысла. То что это функция видно и без нее.

Сообщ. #909845
18.01.2007 14:02
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 26.06.2007 19:18
Сообщ.: 9, Visits: 35
Уважаемый bazile спасибо за оперативный ответ!!!

я сделал всё как ты и сказал:

namespace WindowsService1

{

public partial class Service1 : ServiceBase

{

public Service1()

{

InitializeComponent();

}

protected override void OnStart(string[] args)

{

timer1.Enabled = true;

}

protected override void OnStop()

{

timer1.Enabled = false;

}

private void timer1_Tick(object sender, EventArgs e)

{

fAddErorTextInLog();

}

private static void fAddErorTextInLog()

{

using (StreamWriter ST = new StreamWriter(@"C:\ThisError.log", true))

{

ST.WriteLine(DateTime.Now);

}

}

}

}

Но проблема не исчезла, не хочет таймер работать ну хоть убей.. Всё осталось по прежнему... :( Может есть ещё какие варианты, если есть подскажи пожалуйста...

P.S. а f в начале названия функции я всегда ставлю в собственоручно написаных функциях, это мне необходимо для того чтобы я мог быстро отыскать именно мои функции(имеется ввиду когда вызываю подсказку :))

Сообщ. #909847
18.01.2007 16:11
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
У меня установлена Visual Studio 2005 Std Edition, а там нет возможности писать windows сервисы и я могу только гадать :(

Если у тебя в дизайнере таймер включен по умолчанию, то попробуй его выключить и проверить поможет или нет.

Если нет, то добавь к метод OnStart такой код:

timer1.Enabled = true;
using (StreamWriter ST = new StreamWriter(@"C:\ThisError.log", true))
{
    ST.WriteLine(DateTime.Now);
    ST.WriteLine(timer1.Enabled);
}

Это позволит убедиться что метод OnStart реально вызывается и покажет состояние таймера.

И еще одна идея возникла. Ты похоже используешь таймер типа System.Windows.Forms.Timer, который не предназначен для сервисов. Попробуй вместо него класс System.Timers.Timer. Код тогда будет выглядеть так:

namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        private System.Timers.Timer _logTimer;

        ...

        protected override void OnStart(string[] args)
        {
            if (null == _logTimer)
            {
                _logTimer = new System.Timers.Timer(60*1000); // 1 минута
                _logTimer.Elapsed += OnLogTimerElapsed;
            }
            _logTimer.Start();
        }

        protected override void OnStop()
        {
            if (null != _logTimer)
            {
                _logTimer.Stop();
            }
        }

        private void OnLogTimerElapsed(object source, ElapsedEventArgs e)
        {
            fAddErorTextInLog();
        }

        ...
}

Сообщ. #909854
18.01.2007 18:30
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 26.06.2007 19:18
Сообщ.: 9, Visits: 35
спасибо за то что помог, на самом деле помащь была существенная, ты оказался прав что я не тот таймер исползовал, но правда твой пример я тож не смог запустить и прибегнув к помощи товарищей поопытнее всё заработало, если кому надо код приведен ниже(это точно работающий как надо сервис):
суть его в том что он создает на диске С файл ThisError.log и записывает туда каждые 10 секунд системное время

using System;
using System.ServiceProcess;
using System.IO;
using System.Threading;

namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        Timer myTimer;
        AutoResetEvent autoEvent;
        TimerCallback timerHandler;

        public Service1()
        {
            InitializeComponent();
            autoEvent = new AutoResetEvent(false);
            timerHandler = new TimerCallback(myTimer_tick);
        }

        protected override void OnStart(string[] args)
        {
            myTimer = new Timer(timerHandler, autoEvent, 1000, (10*1000));
        }

        protected override void OnStop()
        {
            myTimer.Dispose();
        }

        private void myTimer_tick(object state)
        {
            fAddErorTextInLog();
        }

        private static void fAddErorTextInLog()
        {
            using (StreamWriter ST = new StreamWriter(@"C:\ThisError.log", true))
            {
                ST.WriteLine(DateTime.Now);
            }
        }
    }
}

Сообщ. #909862
18.01.2007 18:32
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 26.06.2007 19:18
Сообщ.: 9, Visits: 35
bazile выше написаная благадарность - это конечно в твой адрес!!!!!
Сообщ. #909863
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 3:48