2009-12-20 3 views
2

Я пишу службу Windows, которая запускает прослушиватель TCP. Основной код работает отлично, но у меня есть несколько проблем с механикой службы Windows.Как я могу заставить службу прослушивателя TCP прекратить работу правильно?

Прямо сейчас, когда мой сервис запускается, он создает поток и запускает прослушиватель 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, если это имеет значение.]

ответ

7

Вместо прекращение нити с 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 

Когда Shutdown() вызывает socketListen.Close() и рабочий поток в настоящее время ждет новое соединение будет поднят SocketExcpetion. Мы просто игнорируем это.
В вашем методе OnStop() вы сначала даете экземпляру pmtListener возможность законно завершить работу, вызывая myListener.Shutdown() (который затем устанавливает флаг shootdown и закрывает сокет), а затем ждет (до) определенного промежутка времени (например, одна секунда). Если поток все еще жив, попробуйте его прекратить.

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 
+0

Хорошо, допустим, что метод pmtListener имеет метод shutdown(). Как бы это было называться? Нужно ли мне воссоединиться с порожденной нитью? – davidcl

+1

Дайте мне секунду или два для примера ... Я не разработчик VB ;-) Короткий вариант: Не используйте статический метод (shared sub?), Но экземпляр pmtListener (dim myListener как новый pmtListener ()?) и запустите поток в его методе Main() (новый Thread (AddressOf myListener.Main)) – VolkerK

+0

Пример, похоже, работает (тестируется только как консольное приложение, а не служба). Socket.Accept() вызывает (неуправляемый) код winsock, на который не влияет исключение ThreadAbortException. Интересно, есть ли способ «осознать это». Обратите внимание на себя: это заняло слишком много времени. практикуйте больше vb.net. Это _is_ dotnet. – VolkerK

Смежные вопросы