2010-12-27 8 views
0

Ich versuche, einen Windows-Dienst mit C# zu erstellen. Der Dienst muss den TCPListener am Port 5089 öffnen und mit dem Senden von Befehlen beginnen. Aber wenn ich meine TcpListener Initialisierungscode setzen und Start-Dispatching Thread in OnStart() Service-Methode, meinen Dienst nicht startet (Admin-Panel -> Verwaltung -> Dienste -> MyService -> Start)C# Windows Service Schreiben

protected override void OnStart(string[] args) 
{ 
    _server = new CommandServer("LocalCommandServer", "192.168.10.150", false); 

    _server.Initialize("LocalCommandServer", "192.168.10.150"); // In this method starts dispatching thread 
} 

protected override void OnStop() 
{ 
    _server.Dispose(); 
} 

Wie kann ich anfangen meine TCPListener und Versenden von Thread in Windows-Dienst?

public class CommandServer : IDisposable 
{ 
    private IPAddress _serverIP; 

    private bool _mayDispatch; 

    public string Name { get; set; } 

    private Queue<string> _commandsQueue; 
    private TcpListener _commandListener; 
    private Thread _commandListenerThread; 
    private Thread _mainThread; 

    public CommandServer(string name, string serverIP, bool initialize) 
    { 
     if (initialize) 
      Initialize(name, serverIP); 
    } 

    public bool Initialize(string name, string serverIP) 
    { 
     _serverIP = IPAddress.Parse(serverIP); 

     _mayDispatch = true; 

     Name = name; 

     _commandsQueue = new Queue<string>(); 


     _commandListener = new TcpListener(_serverIP, 5089); 

     _commandListenerThread = new Thread(TcpListenerThread); 

     _commandListener.Start(); 
     _commandListenerThread.Start(); 

     _mainThread = Thread.CurrentThread; 

     StartDispatching(); 

     return true; 

    } 

    private void StartDispatching() 
    { 
     while (_mayDispatch) 
     { 
      if (_commandsQueue.Count > 0) 
       DispatchCommand(_commandsQueue.Dequeue()); 
     } 
     _commandListener.Stop(); 
     _commandListenerThread.Abort(); 
    } 

    public void DispatchCommand(string cmnds) 
    { 
     var cmnd = cmnds.Split(' '); 
     switch (cmnd[0].ToLower()) 
     { 
      case "terminate": 
       _mayDispatch = false; 

       break; 

      case "start": 

       var proc = new Process 
         { 
          StartInfo = 
           { 
            FileName = cmnd[1], 
            CreateNoWindow = false, 
            UseShellExecute = true 
           } 
         }; 
       proc.Start(); 

       break; 

     } 
    } 

    public void TcpListenerThread() 
    { 
     while (true) 
     { 
      var client = _commandListener.AcceptTcpClient(); 

      if (client.Connected) 
      { 
       var clientStream = client.GetStream(); 
       var buff = new List<byte>(); 

       while (clientStream.CanRead) 
       { 
        var b = clientStream.ReadByte(); 
        if (b == -1) 
         break; 
        buff.Add((byte)b); 
       } 

       var command = Encoding.ASCII.GetString(buff.ToArray()); 

       _commandsQueue.Enqueue(command); 

       System.Diagnostics.Debug.WriteLine("Queued: " + _commandsQueue.Count); 
      } 
      else 
      { 
       System.Diagnostics.Debug.WriteLine("Not connected"); 
      } 

     } 

    } 

    public void Dispose() 
    { 
     _commandListener.Stop(); 
     _commandListenerThread.Abort(); 
    } 
} 

Antwort

1

TcpListener Initialisierungscode kann einige Ausnahme werfen, versuchen Sie Ihren Dienst Debuggen von Debugger.Launch() als erste Anweisung in Ihrer OnStart setzen und sehen, was dort geschieht.

+0

Code funktioniert korrekt. Problem startet Dispatcher-Thread mit while (true) in OnStart() - OnStart() endet nie und daher startet der Dienst nicht, wenn ich ihn starte. –

+0

@ Evl-ntnt Können wir diesen Teil des Codes sehen? – Incognito

+0

Aktualisierte Frage –

0

ich es gefunden!

protected override void OnStart(string[] args) 
     { 
      _server = new CommandServer("LocalCommandServer", "192.168.10.150", false); 
      _serverThread = new Thread(ServerThread); 
      _serverThread.Start(); 
     } 

     private void ServerThread() 
     { 
      _server.Initialize("LocalCommandServer", "192.168.10.150"); 
     } 

     protected override void OnStop() 
     { 
      _serverThread.Abort(); 
      _server.Dispose(); 
     } 
Verwandte Themen