Question

J'écris un service Windows qui démarre un écouteur TCP. Le code de base fonctionne très bien, mais je vais avoir plusieurs problèmes avec la mécanique d'un service Windows.

En ce moment, quand mon service démarre, il crée un fil et commence l'auditeur TCP dans le fil. Ensuite, lorsque le service cesse, il se termine ce thread:

Public Class txnSocketService
    Inherits System.ServiceProcess.ServiceBase

    Private listenerThread As Thread


    Public Sub New()
        Me.ServiceName = "txnSocketService"
        Me.CanStop = True
        Me.CanPauseAndContinue = True
        Me.AutoLog = True
    End Sub

    Shared Sub Main()
        System.ServiceProcess.ServiceBase.Run(New txnSocketService)
    End Sub

    Protected Overrides Sub OnStart(ByVal args() As String)
        listenerThread = New Thread(AddressOf pmtListener.Main)
        listenerThread.IsBackground = True
        listenerThread.Start()
    End Sub

    Protected Overrides Sub OnStop()
        listenerThread.Abort()
    End Sub

    Private Sub InitializeComponent()
        '
        'txnSocketService
        '
        Me.ServiceName = "txnSocketService"

    End Sub
End Class

Démarrage fonctionne très bien. Si j'arrête le service, cependant, le processus de service ne se termine pas. Qu'est-ce que je fais mal?

[Soit dit en passant, je suis en train de faire cela sur VS2010 Beta 2, si cela importe.]

Était-ce utile?

La solution

Au lieu de terminer le fil avec Thread.Abort (), vous devez mettre en œuvre une méthode shutdown () qui se ferme grâce à la prise.

par exemple.

Public Class pmtListener
  Protected shutingdown As Boolean = False
  ' [...] '
  Public Sub Shutdown()
    shutingdown = True
    socketListen.Close()
  End Sub
  Sub Main()
    Dim socketAccepted As Socket
    shutingdown = False
    socketListen.Listen(3)
    While Not shutingdown
      Try
        socketAccepted = socketListen.Accept()
        ' do something with socketAccepted '
        socketAccepted.Close()
        socketAccepted = Nothing
      Catch ex As SocketException
        If shutingdown Then
          ' ignoring it '
        End If
      End Try

    End While
  End Sub

Lors de l'arrêt () appelle socketListen.Close () et le thread de travail est actuellement en attente d'une nouvelle connexion un SocketExcpetion sera élevé. Nous ignorons tout cela.
Dans votre OnStop () méthode donne d'abord l'instance pmtListener une chance d'arrêter gracieusement en appelant myListener.Shutdown () (qui fixe alors le drapeau de shutingdown et ferme la prise), puis attendez (jusqu'à) un certain laps de temps (par exemple un seconde ). le fil doit être en vie toujours essayer d'y mettre fin.

Public Class txnSocketService
  Inherits System.ServiceProcess.ServiceBase

  Protected myListener as pmtListern
  Protected listenerThread As Thread

  ' [...] '
  Protected Overrides Sub OnStart(ByVal args() As String)
    myListener = new pmtListener
    listenerThread = New Thread(AddressOf myListener.Main)
    listenerThread.IsBackground = True
    listenerThread.Start()
  End Sub

  Protected Overrides Sub OnStop()
    myListener.Shutdown()
    listenerThread.Join(1000) ' give it a second '
    If listenerThread.IsAlive Then
      listenerThread.Abort()
    End If
  End Sub
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top