TCP 리스너 서비스가 올바르게 종료되도록하려면 어떻게해야합니까?
-
20-09-2019 - |
문제
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
제휴하지 않습니다 StackOverflow