كيف يمكنني الحصول على بلدي خدمة المستمع 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 بيتا 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 () أولا أن تعطي المثال pmtListener فرصة لإيقاف بأمان من خلال الدعوة myListener.Shutdown () (والتي ثم يعين إشارة shutingdown ويغلق المقبس) ثم الانتظار (الحد الأقصى) فترة زمنية معينة (مثل ثانية واحدة ). يجب على موضوع لا يزال على قيد الحياة محاولة لإنهائه.
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