2010-12-27 2 views
0

Je tente de créer un service Windows en utilisant C#. Le service doit ouvrir TCPListener sur le port 5089 et commencer à envoyer les commandes. Mais si je mets mon code d'initialisation de TcpListener et du fil envoi à partir en méthode de service OnStart(), mon service ne démarre (panneau d'administration -> Administration -> Services -> MyService -> Démarrer)C# Windows service d'écriture

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(); 
} 

Comment puis-je commencer mon TCPListener et envoi de thread dans le service Windows?

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(); 
    } 
} 

Répondre

1

code d'initialisation de TcpListener peut lancer une exception, essayez le débogage de votre service en mettant Debugger.Launch() comme la première déclaration dans votre OnStart, et voir ce qui se passe là-bas.

+0

Le code fonctionne correctement. Le problème est de lancer le thread de distribution avec while (true) dans OnStart() - OnStart() ne se termine jamais et par conséquent le service ne démarre pas lorsque je le lance. –

+0

@ Evl-ntnt Peut-on voir cette partie du code? – Incognito

+0

Mise à jour de la question –

0

Je l'ai trouvé!

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(); 
     }