どのように私は私の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とのスレッドを終了させます。
例えばます。
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
所属していません StackOverflow