C # Windows службы написания - PullRequest
       21

C # Windows службы написания

0 голосов
/ 27 декабря 2010

Я пытаюсь создать службу Windows, используя C #.Служба должна открыть TCPListener на порту 5089 и запустить диспетчеризацию команд.Но если я добавлю код инициализации TCPListener и начну диспетчеризацию потока в метод службы OnStart (), моя служба не запустится (Панель администратора -> Администрирование -> Службы -> MyService -> Запуск)

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 service?

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

Ответы [ 3 ]

1 голос
/ 27 декабря 2010

Код инициализации TCPListener может выдавать какое-то исключение, попробуйте отладить ваш сервис, указав Debugger.Launch() в качестве первого оператора в OnStart и посмотрите, что там происходит.

0 голосов
/ 27 декабря 2010

Я нашел это!

  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();
        }
0 голосов
/ 27 декабря 2010

Вам необходимо вернуться из события OnStart.

См. Образец здесь http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

...