Запуск windows службы
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Запуск windows службы Expand / Collapse
Автор
Сообщение
02.07.2007 14:40
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Прочел в книге А. Гарнаева о создании служб в 2003 студии.
в vs 2005 сделал по аналогии:
1.

Imports System.IO
Imports System.ServiceProcess

Public Class FPDServ
'Inherits System.ServiceProcess.servisebase

Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
Dim f As TextWriter = New StreamWriter("c:\test.txt")
f.WriteLine("on")
f.Close()
Timer1.Enabled = True
Timer1.Interval = 1000
EventLog.WriteEntry("FPDServe on")
End Sub

Protected Overrides Sub OnStop()
' Add code here to perform any tear-down necessary to stop your service.
Timer1.Enabled = False
Dim f As TextWriter = New StreamWriter("c:\test.txt")
f.WriteLine("off")
f.Close()
EventLog.WriteEntry("FPDServe off")
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim f As IO.StreamWriter = New IO.StreamWriter("c:\test.txt", True)
f.WriteLine("PerformanceCounter " & PerformanceCounter1.NextValue.ToString _
& TimeOfDay.ToLongTimeString)
f.Close()
End Sub

Protected Overrides Sub OnContinue()
MyBase.OnContinue() 'auto gen
Dim f As TextWriter = New StreamWriter("c:\test.txt")
f.WriteLine("Continue")
f.Close()
EventLog.WriteEntry("FPDServe Continue")
End Sub

Protected Overrides Sub OnPause()
MyBase.OnPause() 'auto gen
Dim f As TextWriter = New StreamWriter("c:\test.txt")
f.WriteLine("Pause")
f.Close()
EventLog.WriteEntry("FPDServe Paused")
End Sub

End Class


2. Добавил Installer.
ServiceInstaller.Name = FPDServe ' ИмяМоегоСервиса
ServiceProcessInstaller.Account = LocalSystem
Успешно откомпилировал.

3. Успешно установил.
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe FPDServe.exe

При попытке запуска службы из оснастки выдается сообщение
An unhandled exception ('System.InvalidOperationException') occured in FPDServe.exe [968] с предложением отладки в VS 2005
Затем выдается сообщение:
Ошибка 1053: Служба не ответила на запрос своевременно.

Использую WinXP,
.NET Framework 2.0 Configuration
(version 2.0.50727.42)

С уважением,
Сообщ. #914468
02.07.2007 15:17
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Рискну предположить что это происходит из-за использования класса System.Windows.Forms.Timer (переменная Timer1). Этот тип таймеров предназначен для использования только в GUI приложениях так как работает через механизм оконнных сообщений. Попробуй использовать класс System.Threading.Timer.
Сообщ. #914470
02.07.2007 16:37
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Как использовать в службе System.Threading.Timer сам не разобрался. Если можно пример.

С уважением,
Сообщ. #914473
02.07.2007 17:25
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 16.04.2008 11:44
Сообщ.: 366, Visits: 2 473
Убрал вообще таймер из проекта. Результат тот же.

С уважением,
Сообщ. #914474
02.07.2007 17:36
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
У меня нет Visual Basic чтобы кинуть сюда проверенный код поэтому объясню на словах.

Объяви в классе private переменную типа System.Threading.Timer. Создай два метода StartTimer и StopTimer. Добавь вызов StartTimer в методы OnStart и OnContinue, а вызов StopTimer в OnStop и в OnPause.

Создай метод c кодом из Timer1_Tick

Private Sub OnTimerTick(Object state)
...
End Sub

В методе StartTimer напиши код создающий экземпляр System.Threading.Timer. Надо вызывать конструктор с 4 аргументами: 1) адрес функции OnTimerTick 2) доп. аргумент для функции таймера (Nothing) 3) 0 4) 1000.

В методе StopTimer надо сделать вызов метода Timer.Change(Timeout.Infinite) - чтобы остановить таймер и присвоение переменной класса значения Nothing чтобы ее подобрал сборщик мусора.

Вроде все.

Сообщ. #914475
02.07.2007 17:41
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
babken76 (02.07.2007)
Убрал вообще таймер из проекта. Результат тот же.

Любопытно. А что будет если закоментировать код в процедурах OnStart/OnStop/OnPause/OnContinue? То есть оставить голый скелет без реального кода. Если и такой вариант будет слетать, то проблема явно не в твоем коде.

Кстати, почему у тебя закоментировано наследование от ServiceBase?

Сообщ. #914477
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin

Время GMT +3:00, Сейчас 11:35