Windows服务难题

时间:2010-03-30 16:21:02

标签: windows vb.net windows-services

全部,我有一个自定义对象,我用VB.NET(.net 2.0)编写。该对象实例化其自己的threading.timer对象并执行许多后台进程,包括定期询问oracle数据库以及根据数据库中检测到的数据通过smtp发送电子邮件。以下是Windows服务类

中实现的代码
Public Class IncidentManagerService
'Fakes
Private _fakeRepoFactory As IRepoFactory
Private _incidentRepo As FakeIncidentRepo
Private _incidentDefinitionRepo As FakeIncidentDefinitionRepo
Private _incManager As IncidentManager.Session

'Real
Private _started As Boolean = False
Private _repoFactory As New NHibernateRepoFactory
Private _psalertsEventRepo As IPsalertsEventRepo = _repoFactory.GetPsalertsEventRepo()
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.
    If Not _started Then
        Startup()
        _started = True
    End If

End Sub

Protected Overrides Sub OnStop()

    'Tear down class variables in order to ensure the service stops cleanly
    _incManager.Dispose()
    _incidentDefinitionRepo = Nothing
    _incidentRepo = Nothing
    _fakeRepoFactory = Nothing
    _repoFactory = Nothing

End Sub

Private Sub Startup()
    Dim incidents As IList(Of Incident) = Nothing
    Dim incidentFactory As New IncidentFactory

    incidents = IncidentFactory.GetTwoFakeIncidents
    _repoFactory = New NHibernateRepoFactory
    _fakeRepoFactory = New FakeRepoFactory(incidents)
    _incidentRepo = _fakeRepoFactory.GetIncidentRepo
    _incidentDefinitionRepo = _fakeRepoFactory.GetIncidentDefinitionRepo

    'Start an incident manager session
    _incManager = New IncidentManager.Session(_incidentRepo, _incidentDefinitionRepo, _psalertsEventRepo)
    _incManager.Start()

End Sub

End Class

经过一些实验,我在OnStart方法中得到了上面的代码。在我的开发PC上从VS2005部署时,所有功能都通过了测试,但是当部署在真正的目标计算机上时,该服务将无法启动并响应以下消息:

“本地计算机上的服务已启动,然后停止......”

我是否以正确的方式进行此操作?如果不是,我怎样才能在Windows服务类的范围内最好地实现我的事件管理器。为事件管理器实现一个计时器似乎毫无意义,因为它已经实现了自己的计时器......

非常感谢任何帮助。

亲切的问候

Paul J.

1 个答案:

答案 0 :(得分:1)

我有几点建议。

首先,Windows服务必须能够在设定的一段时间内成功启动(默认情况下我认为是30秒)。您收到的错误消息并未指出这是一个问题,但您可能希望在服务的OnStart中启动快速计时器,并在TimerElapsed事件处理程序中启动您的启动过程。这样可以保证每次都开始服务。

其次,正如一些评论中所建议的那样,您必须向您的应用添加日志记录。每个好的服务都应该能够记录在跟踪问题时有用的一切。大多数常见的日志记录框架都允许您设置不同的详细级别,以便在运行良好时日志更小。