Service

  • Автор темы f.7
  • Дата начала
F
#1
Подскажите как сделать так, чтобы программа зыпускалась как служба????
 
F
#3
Вот чтобы не создавать новой темы решил написать тута..... Научился я запускать службы и остановливать, но вот второй день уже не могу решить одну прблему... Мне служба необходима для того чтобы она писала лог, ну тоесть чтобы одна функция вызывалась через определённый отрезок времени, пробовал я это повесить на TIMER, но почемуто он не работает в WindowsService, потом на одном форуме я нашел вот такое решение:
protected override void OnStart(string[] args)
{
ServiceThread();
}
........
private static void ServiceThread()
{
int time_to_sleep = 100000;
while (true)
{
//А вот тут вызываем нужную фенкцию
System.Threading.Thread.Sleep(time_to_sleep);
}
}
но это решение не хорошое, т.к. останавливается работа всей службы...

Вот я и хотел бы узнать как же мне вызывать в сервисе функцию через допустим минуту..????
Буду очень признателен тем, кто откликнеться и не оставит меня в беде..........
 
K

karlito

#4
Для: f.7
Есть целых три Timer-а в FCL. Какой из них ты используешь? как и когда ты его регистрируешь?
Для твоей ситуации лучше всего System.Threading.Timer.
 
F
#5
Для karlito
Спасиба за совет, решение я уже нашел, таймер использую System.Timers.Timer, правда сейчас этот код на работе, а у меня сейчас сессия, но если каму нада вы напишите я с удовольствием выложу когда закончиться сессия......
 

iosif88

Well-known member
14.10.2009
97
1
#6
Для karlito
Спасиба за совет, решение я уже нашел, таймер использую System.Timers.Timer, правда сейчас этот код на работе, а у меня сейчас сессия, но если каму нада вы напишите я с удовольствием выложу когда закончиться сессия......
Необходимо решение этой проблемы.

Вообщем имеется windows service и он должен переодически(скажем каждые 10 сек) вызывать определенуую функцию (например записать в лог сообщение) . Как это сделать?
 

iosif88

Well-known member
14.10.2009
97
1
#7
Необходимо решение этой проблемы.

Вообщем имеется windows service и он должен переодически(скажем каждые 10 сек) вызывать определенуую функцию (например записать в лог сообщение) . Как это сделать?
Если кому понадобиться вот решение:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace WindowsService1
{
public partial class Service1 : ServiceBase
{
System.Windows.Forms.Timer timer1;
Form form1;
Thread messageThread;

public Service1()
{
InitializeComponent();
}

protected override void OnStart(string[] args)
{
messageThread = new Thread(new ThreadStart(ThreadProc));
messageThread.Start();
messageThread.IsBackground = true;
}

void ThreadProc()
{
form1 = new Form();
timer1 = new System.Windows.Forms.Timer();
timer1.Tick += new EventHandler(timer_Tick);
timer1.Interval = 10000; //задаем нужный нам интервал в мс
timer1.Start();
form1.Show();

Application.Run(form1);
}
void timer_Tick(object sender, EventArgs e)
{
//Эта функция будет вызываться переодически через заданное количество мс указанных в timer1.Interval
//Здесь и реализуем нужную нам функциональность
}
}
}
 

iosif88

Well-known member
14.10.2009
97
1
#8
И зачем нужны окна в сервисе?
Окна видно не будет. А нужно оно для таймера.
Если подскажете как реализовать таймер без окна было бы здорово. ))
System.Timers.Timer срабатывает всего один раз. А нужно чтоб функция вызывалась переодически.
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#9
Окна видно не будет. А нужно оно для таймера.
класс System.Threading.Timer, например
срабатывает всего один раз. А нужно чтоб функция вызывалась переодически.
А код вы проверили? Настроили правильно?=)<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">вот пример</div></div><div class="sp-body"><div class="sp-content">
C++:
using System;
//Включаем необходимое пространство имен.
using System.Timers;
public class MyTimer
{
static int n=0; //Счетчик.
public static void Main()
{
System.Timers.Timer tmr = new System.Timers.Timer();
tmr.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
tmr.Interval=1000; //Устанавливаем интервал в 1 сек.
tmr.Enabled=true; //Вкючаем таймер.
while(n!=4); //Таймер тикает 4 раза.
}
//Метод для отработки события Elapsed таймера.
public static void OnTimedEvent(object source, ElapsedEventArgs e)
{
//Делаем некоторые действия.
Console.WriteLine("Hello World!");
//Увеличиваем счетчик.
n++;
}
}
Не рекомендует Рихтер этот класс использовать. Старый он..
 

iosif88

Well-known member
14.10.2009
97
1
#10
класс System.Threading.Timer, например

А код вы проверили? Настроили правильно?=)<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">вот пример</div></div><div class="sp-body"><div class="sp-content">
C++:
using System;
//Включаем необходимое пространство имен.
using System.Timers;
public class MyTimer
{
static int n=0; //Счетчик.
public static void Main()
{
System.Timers.Timer tmr = new System.Timers.Timer();
tmr.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
tmr.Interval=1000; //Устанавливаем интервал в 1 сек.
tmr.Enabled=true; //Вкючаем таймер.
while(n!=4); //Таймер тикает 4 раза.
}
//Метод для отработки события Elapsed таймера.
public static void OnTimedEvent(object source, ElapsedEventArgs e)
{
//Делаем некоторые действия.
Console.WriteLine("Hello World!");
//Увеличиваем счетчик.
n++;
}
}
Не рекомендует Рихтер этот класс использовать. Старый он..
На счет класса описка. Именно System.Threading.Timer я и имел ввиду. Реализация была почти такая же что привели вы. Но мне нужно чтоб
1)он срабатывал неограниченное число раз.
2) Как реализовать это в службе?
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#11
1. В примере выше - что мешает просто запустить цикл который прервется только если какая-то переменная станет TRUE?
2. От того, что у вас служба - класс не изменится, поверьте=) Точно так же)
 

iosif88

Well-known member
14.10.2009
97
1
#12
1. В примере выше - что мешает просто запустить цикл который прервется только если какая-то переменная станет TRUE?
2. От того, что у вас служба - класс не изменится, поверьте=) Точно так же)
1. Мешает 100 % загрузка процессора
2. Куда передается управление в службе после завершения метода OnStart ? Хотя я щас проверю ))
 

iosif88

Well-known member
14.10.2009
97
1
#14
У вас ведь таймер в цикле=> будет задержка. Не будет такого.
Я так понимаю вы предлагаете следующее ?

using System;
//Включаем необходимое пространство имен.
using System.Timers;
public class MyTimer
{
static int n=0; //Счетчик.
public static void Main()
{
System.Timers.Timer tmr = new System.Timers.Timer();
tmr.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
tmr.Interval=1000; //Устанавливаем интервал в 1 сек.
tmr.Enabled=true; //Вкючаем таймер.
while(True); //Таймер тикает 4 раза.
}
//Метод для отработки события Elapsed таймера.
public static void OnTimedEvent(object source, ElapsedEventArgs e)
{
//Делаем некоторые действия.
Console.WriteLine("Hello World!");
//Увеличиваем счетчик.
n++;
}
}