ОБСУЖДЕНИЕ

Service

13 ответов 8,4 тыс.
AI-выжимка обсуждения скоро

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

Автор темы
Подскажите как сделать так, чтобы программа зыпускалась как служба????
 
Вот две статьи, думаю помогоут.
 

Вложения

Вот чтобы не создавать новой темы решил написать тута..... Научился я запускать службы и остановливать, но вот второй день уже не могу решить одну прблему... Мне служба необходима для того чтобы она писала лог, ну тоесть чтобы одна функция вызывалась через определённый отрезок времени, пробовал я это повесить на 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);
}
}
но это решение не хорошое, т.к. останавливается работа всей службы...

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

Необходимо решение этой проблемы.

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

Вообщем имеется 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
//Здесь и реализуем нужную нам функциональность
}
}
}
 
И зачем нужны окна в сервисе?

Окна видно не будет. А нужно оно для таймера.
Если подскажете как реализовать таймер без окна было бы здорово. ))
System.Timers.Timer срабатывает всего один раз. А нужно чтоб функция вызывалась переодически.
 
Окна видно не будет. А нужно оно для таймера.
класс 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, например

А код вы проверили? Настроили правильно?=)<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) Как реализовать это в службе?
 
1. В примере выше - что мешает просто запустить цикл который прервется только если какая-то переменная станет TRUE?
2. От того, что у вас служба - класс не изменится, поверьте=) Точно так же)
 
1. В примере выше - что мешает просто запустить цикл который прервется только если какая-то переменная станет TRUE?
2. От того, что у вас служба - класс не изменится, поверьте=) Точно так же)

1. Мешает 100 % загрузка процессора
2. Куда передается управление в службе после завершения метода OnStart ? Хотя я щас проверю ))
 
У вас ведь таймер в цикле=> будет задержка. Не будет такого.

Я так понимаю вы предлагаете следующее ?

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++;
}
}