我怎样才能让我的TCP监听服务正常终止?
-
20-09-2019 - |
题
我正在写一个Windows服务,启动TCP监听。核心代码工作正常,但我有几个问题,一个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 Beta 2中,如果该事项。
解决方案
相反终止与Thread.Abort的线程()应实现一些正常关闭套接字shutdown()方法的。
e.g。
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
当关断()调用socketListen.Close()和工作线程当前正在等待一个新的连接的SocketExcpetion将升高。我们就忽略这个问题。结果 在你调用OnStop()方法,你先给pmtListener实例的机会优雅的关闭,通过调用myListener.Shutdown()(然后设置shutingdown标志和关闭套接字),然后等待(最多)一段时间内(如1秒)。如果线程还活着尝试终止它。
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