どのように私は私のTCPリスナーサービスが正しく終了するように得ることができますか?

StackOverflow https://stackoverflow.com/questions/1934746

質問

私は、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とのスレッドを終了させます。

例えばます。

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()メソッドでは、最初に(例えば1秒(当時shutingdownフラグを設定し、ソケットを閉じ)myListener.Shutdown()を呼び出すことにより、正常にシャットダウンに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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top