.net 如何使TCP侦听器服务正确终止?
我正在编写一个启动TCP侦听器的Windows服务。核心代码运行良好,但我在Windows服务的机制方面遇到了一些问题 现在,当我的服务启动时,它会创建一个线程并在线程中启动TCP侦听器。然后,当服务停止时,它终止该线程:.net 如何使TCP侦听器服务正确终止?,.net,vb.net,windows-services,visual-studio-2010,.net,Vb.net,Windows Services,Visual Studio 2010,我正在编写一个启动TCP侦听器的Windows服务。核心代码运行良好,但我在Windows服务的机制方面遇到了一些问题 现在,当我的服务启动时,它会创建一个线程并在线程中启动TCP侦听器。然后,当服务停止时,它终止该线程: Public Class txnSocketService Inherits System.ServiceProcess.ServiceBase Private listenerThread As Thread Public Sub New()
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 当Shutdown()调用socketListen.Close()并且工作线程当前正在等待新连接时,将引发SocketException。我们只是忽略了这一点。
在OnStop()方法中,首先通过调用myListener.shutdown()(然后设置shuttingdown标志并关闭套接字)为pmtListener实例提供一个正常关闭的机会,然后等待(最多)特定的时间跨度(例如一秒钟)。如果线程仍然处于活动状态,请尝试终止它
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
好的,假设pmtListener有一个shutdown()方法。叫它什么名字?我需要重新加入生成的线程吗?给我一两秒钟的时间举个例子……我不是VB开发人员;-)简短版本:不要使用静态方法(shared sub?),而是使用pmtListener的实例(将myListener作为新的pmtListener()?)并在其Main()方法(new thread(AddressOf myListener.Main))上启动线程示例似乎可以工作(仅作为控制台应用程序而不是服务进行测试)。Accept()调用不受ThreadAbortException影响的(非托管)winsock代码。我想知道是否有办法“让它意识到”。自我提醒:这花了太长时间。多练习vb.net。它是dotnet。我仍然会这样做,但我认为从技术上讲,Join()和Abort()故障保护是不必要的,因为该线程是后台线程,当进程消失时,该线程会自动终止。然后使用TCPListener的Stop()方法,
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