Я пишу службу 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, если это имеет значение.]
Хорошо, допустим, что метод pmtListener имеет метод shutdown(). Как бы это было называться? Нужно ли мне воссоединиться с порожденной нитью? – davidcl
Дайте мне секунду или два для примера ... Я не разработчик VB ;-) Короткий вариант: Не используйте статический метод (shared sub?), Но экземпляр pmtListener (dim myListener как новый pmtListener ()?) и запустите поток в его методе Main() (новый Thread (AddressOf myListener.Main)) – VolkerK
Пример, похоже, работает (тестируется только как консольное приложение, а не служба). Socket.Accept() вызывает (неуправляемый) код winsock, на который не влияет исключение ThreadAbortException. Интересно, есть ли способ «осознать это». Обратите внимание на себя: это заняло слишком много времени. практикуйте больше vb.net. Это _is_ dotnet. – VolkerK