|
|
|
новичок
      
участник
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 дня, облазил много форумов но там не нашел решение моей проблемы...
|
|
|
|
|
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 в начале имени функции нет никакого смысла. То что это функция видно и без нее.
|
|
|
|
|
новичок
      
участник
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 в начале названия функции я всегда ставлю в собственоручно написаных функциях, это мне необходимо для того чтобы я мог быстро отыскать именно мои функции(имеется ввиду когда вызываю подсказку :))
|
|
|
|
|
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(); } ... }
|
|
|
|
|
новичок
      
участник
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); } } } }
|
|
|
|
|
новичок
      
участник
Last Login: 26.06.2007 19:18
Сообщ.: 9,
Visits: 35
|
|
| bazile выше написаная благадарность - это конечно в твой адрес!!!!!
|
|
|
|