.net 如何使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()

我正在编写一个启动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 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