C# преобразование консольного приложения в сервис
Я пытаюсь преобразовать консольное приложение в службе Windows. Я пытаюсь заставить метод onstart службы вызвать метод в моем классе, но я не могу заставить его работать. Я не уверен, что делаю это правильно. Где я могу поместить информацию о классе в сервис
protected override void OnStart(string[] args)
{
EventLog.WriteEntry("my service started");
Debugger.Launch();
Program pgrm = new Program();
pgrm.Run();
}
из комментария:
namespace MyService {
static class serviceProgram {
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main() {
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] {
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
}
}
2 ответов
на документация MSDN на Windows Services действительно хорошо и имеет все необходимое для начала работы.
проблема, с которой вы столкнулись, связана с вашей реализацией OnStart, которая должна использоваться только для настройки службы, чтобы она была готова к запуску, метод должен быстро вернуться. Обычно вы запускаете основную часть кода в другом потоке или в таймере. Смотрите страницу для OnStart для подтверждения.
Edit: Не зная, что будет делать ваша служба windows, трудно сказать вам, как ее реализовать, но предположим, вы хотите запускать метод каждые 10 секунд во время работы службы:
public partial class Service1 : ServiceBase
{
private System.Timers.Timer _timer;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
#if DEBUG
System.Diagnostics.Debugger.Launch(); // This will automatically prompt to attach the debugger if you are in Debug configuration
#endif
_timer = new System.Timers.Timer(10 * 1000); //10 seconds
_timer.Elapsed += TimerOnElapsed;
_timer.Start();
}
private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
{
// Call to run off to a database or do some processing
}
protected override void OnStop()
{
_timer.Stop();
_timer.Elapsed -= TimerOnElapsed;
}
}
здесь OnStart
метод возвращается сразу после настройки таймера и TimerOnElapsed
будет выполняться в рабочем потоке. Я также добавил вызов System.Diagnostics.Debugger.Launch();
что сделает отладку намного проще.
если у вас есть другие требования, пожалуйста, отредактируйте свой вопрос или оставьте комментарий.
сделайте себе одолжение и использовать topshelf http://topshelf-project.com/ создать свой сервис. Я не видел ничего проще. Их документация supperb и развертывание не может быть проще. c:/path службы/Службы.exe установки.