Solved

Properly stopping a .net windows service

Posted on 2009-07-01
4
275 Views
Last Modified: 2013-12-17
How can I stop a vb.net windows service from within the code and have the service show as stopped in the WMI?  For example, if I am looking for a config file on startup and don't find it, I just want to stop the service.  I tried the code below, and it does stop executing the code in the DoWork routine (because the event log doesn't get wriitten to anymore), but the service still shows as started in the WMI.
Public Class TestService
 
    Private _worker As New Worker()
 
    Protected Overrides Sub OnStart(ByVal args() As String)
        Dim wt As System.Threading.Thread
        Dim ts As System.Threading.ThreadStart
        ts = AddressOf _worker.DoWork
        wt = New System.Threading.Thread(ts)
        wt.Start()
    End Sub
 
    Protected Overrides Sub OnStop()
        _worker.StopWork()
    End Sub
 
 
    Public Class Worker
 
        Private m_thMain As System.Threading.Thread
        Private m_booMustStop As Boolean = False
        Private m_rndGen As New Random(Now.Millisecond)
 
        Public Sub StopWork()
            m_booMustStop = True
            If Not m_thMain Is Nothing Then
                If Not m_thMain.Join(100) Then
                    m_thMain.Abort()
                End If
            End If
        End Sub
 
        Public Sub DoWork()
            Dim TestCounter As Integer = 0    'we'll stop the the service after we loop through twice
            m_thMain = System.Threading.Thread.CurrentThread
            Dim i As Integer = m_rndGen.Next
            m_thMain.Name = "Thread" & i.ToString
            While Not m_booMustStop
                TestCounter += 1
                System.Diagnostics.EventLog.WriteEntry("EmptyService", "Start work: " & m_thMain.Name)
                System.Threading.Thread.Sleep(10000)
                System.Diagnostics.EventLog.WriteEntry("EmptyService", "Finish work: " & m_thMain.Name)
                If TestCounter > 1 Then StopWork()
            End While
        End Sub
    End Class
 
End Class

Open in new window

0
Comment
Question by:grantdaddy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 14

Accepted Solution

by:
shahprabal earned 500 total points
ID: 24757811
You need to use the System.ServiceProcess.ServiceController class :
http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx
 
0
 

Author Comment

by:grantdaddy
ID: 24763405
Thanks shahprabal.  I tried the code below and it is kind of working.  The service still shows as Started in the WMI (even if you refresh the list or exit WMI and come back in) but if you try to stop the service through the WMI, you get a windows message box saying they service could not be stopped due to an internal error.  It is like the service really is stopped but WMI does not know it.

Is the code below what you would typically use?
Dim Services() As ServiceController = ServiceController.GetServices
For Each service As ServiceController In Services
   If service.ServiceName = "Test" Then
      service.Stop()
      Exit For
   End If
Next

Open in new window

0
 
LVL 14

Expert Comment

by:shahprabal
ID: 24763463
1) Check the value of service.CanStop
This should be true else the service is created such that it can't be stopped.
2) Add this line after service.Stop()
service.Refresh()
3) Then check the status property value:
service.Status()
0
 
LVL 14

Expert Comment

by:shahprabal
ID: 24763471
0

Featured Post

How our DevOps Teams Maximize Uptime

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us. Read the use case whitepaper.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
Attackers love to prey on accounts that have privileges. Reducing privileged accounts and protecting privileged accounts therefore is paramount. Users, groups, and service accounts need to be protected to help protect the entire Active Directory …

734 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question