문제

TCP 리스너를 시작하는 Windows 서비스를 작성하고 있습니다. 핵심 코드는 잘 작동하지만 Windows 서비스의 메커니즘에 몇 가지 문제가 있습니다.

지금 바로 내 서비스가 시작되면 스레드를 생성하고 스레드에서 TCP 리스너를 시작합니다. 그런 다음 서비스가 중지되면 해당 스레드를 종료합니다.

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

시작하는 것은 잘 작동합니다. 그러나 서비스를 중지하면 서비스 프로세스가 종료되지 않습니다. 내가 뭘 잘못하고 있죠?

그건 그렇고, 나는 현재 VS2010 베타 2 에서이 작업을 수행하고 있습니다.

도움이 되었습니까?

해결책

Thread.Abort ()로 스레드를 종료하는 대신 소켓을 우아하게 닫는 일부 shutdown () 메소드를 구현해야합니다.

예를 들어

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

shutdown ()가 socketListen.close ()를 호출하면 작업자 스레드가 현재 새로운 연결을 기다리고 있습니다. 우리는 그것을 무시합니다.
onstop () 메소드에서 먼저 pmtlistener 인스턴스에 mylistener.shutdown ()를 호출하여 우아하게 셧다운 할 수있는 기회를 제공합니다. ). 스레드가 여전히 살아 있으면 종료하려고합니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top