- Хроники. - -
Еще раз о работе со службами (Windows Service) на C#
Posted By Ikutsin On 15 сентября 2011 @ 14:04 In .NET C# | Comments Disabled
[1]Службы Windows это удобный способ запускать и контролировать программы, выполняемые на заднем плане. Они часто используются в больших приложениях или как альтернатива консоли или Form приложения, которое можно спрятать в трей. Сегодня я попробую объединить все идеи и наработки касательно сервисов и консольных приложений, используемые мной за время
моего «молчания» лета.
Дело в том, что когда вы начнете переносить приложение в Формы или Службу, от этого потока нужно будет избавится или перенаправить в другое место.
Mono окружение обладает рядом особенностей работы со службой. Несмотря на то, что «запускалка» сервисов в Mono есть, я вообще отказался от служб в кросс-платформанных приложениях. Дело в том, что в mono-service нет одной мелочи, переключения на новый сборщик мусора. А это ведет к утечкам, при использовании .NET 4.0. Тут есть выход, так как в Linux еще больше способов послать консоль в фон, чем в Windows. 🙂
Как вариант, можно сделать lock на основе файла:
#region FileLock private static FileSystemWatcher watcher; private static string watchFilename; public static void LockByFile(string filename = "lock") { if (File.Exists(filename)) File.Delete(filename); File.WriteAllText(filename, ""); watchFilename = filename; watcher = new FileSystemWatcher(Environment.CurrentDirectory); watcher.Deleted += watcher_Deleted; watcher.Renamed += watcher_Renamed; watcher.EnableRaisingEvents = true; log.Warn("to unlock: Delete file - " + filename); while (!String.IsNullOrEmpty(watchFilename)) Thread.Sleep(800); } private static void watcher_Renamed(object sender, RenamedEventArgs e) { if (!File.Exists(watchFilename)) watchFilename = null; } static void watcher_Deleted(object sender, FileSystemEventArgs e) { if (e.Name == watchFilename) watchFilename = null; } #endregion
Вот так выглядит .bat файл, который я даю вместе с программой, которая будет запускаться на Windows в качестве службы:
::
@ECHO OFF
echo :: This script will install and start
echo :: [YourProgram] service
rem set UTIL=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe
set UTIL=C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe
set NAME=Program.exe
cd %~dp0
%UTIL% %NAME% /ShowCallStack
echo :: If service started: (if not, you are probably not under Administrator rights)
echo :: Press [Enter] to stop and uninstall it.
echo :: Press [Ctrl+C] to leave it in the service table.
pause
%UTIL% %NAME% /u BioStarSimpleConnector.exe
Article printed from Хроники.:
URL to article: /2175-eshhe-raz-o-rabote-so-sluzhbami-windows-service-na-c
URLs in this post:
[1] Image: /wp-content/uploads/2011/09/1279884155_windowsupdate.jpg
[2] NDesk.Options: http://www.ndesk.org/Options
[3] getline.cs: https://github.com/migueldeicaza/muget/blob/master/getline.cs
[4] пример тут: /2149-c-zapusk-windows-servisov-kak-konsolnyx-prilozhenij
Click here to print.
Copyright © 2008 Все, что меня окружает. All rights reserved.