|
|
|
Supreme 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)
С уважением,
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Рискну предположить что это происходит из-за использования класса System.Windows.Forms.Timer (переменная Timer1). Этот тип таймеров предназначен для использования только в GUI приложениях так как работает через механизм оконнных сообщений. Попробуй использовать класс System.Threading.Timer.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 16.04.2008 11:44
Сообщ.: 366,
Visits: 2 473
|
|
Как использовать в службе System.Threading.Timer сам не разобрался. Если можно пример.
С уважением,
|
|
|
|
|
Supreme Being
      
участник
Last Login: 16.04.2008 11:44
Сообщ.: 366,
Visits: 2 473
|
|
Убрал вообще таймер из проекта. Результат тот же.
С уважением,
|
|
|
|
|
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 чтобы ее подобрал сборщик мусора. Вроде все.
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
babken76 (02.07.2007) Убрал вообще таймер из проекта. Результат тот же.Любопытно. А что будет если закоментировать код в процедурах OnStart/OnStop/OnPause/OnContinue? То есть оставить голый скелет без реального кода. Если и такой вариант будет слетать, то проблема явно не в твоем коде. Кстати, почему у тебя закоментировано наследование от ServiceBase?
|
|
|
|