2010-12-27 8 views
0

私はC#を使用してWindowsサービスを作成しようとしています。サービスは、5089ポートでTCPListenerを開き、ディスパッチコマンドを開始する必要があります。しかし、私は私のTCPListener初期化コードを入れてのOnStart()サービスメソッド、私のサービスではありません開始にディスパッチスレッドを開始する場合(管理パネル - >管理 - >サービス - > MyServiceで - >スタート)C#windows service writing

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

私が開始することができますどのように私のTCPListenerと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(); 
    } 
} 

答えて

1

TCPListener初期化コードは、いくつかの例外をスローすることができる、あなたのOnStartに最初の文としてDebugger.Launch()を置くことによって、あなたのサービスをデバッグしようとし、そこに何が起こっているかを参照してください。

+0

コードが正しく動作します。 OnStart()でwhile(true)を指定してディスパッチスレッドを起動しようとすると、OnStart()が終了せず、起動時にサービスが開始されません。 –

+0

@ Evl-ntntコードの一部を見ることができますか? – Incognito

+0

更新された質問 –

0

をサンプルを参照してください!

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(); 
     } 
関連する問題