كيف يمكنني الحصول على بلدي خدمة المستمع TCP لإنهاء بشكل صحيح؟

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

سؤال

وأنا أكتب خدمة 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top