/// <summary>
        /// Listens for client connections
        /// </summary>
        private static void ListenForClients(object currentServer)
        {
            NamedPipesServer server = (NamedPipesServer)currentServer;

            try
            {
                while (server.Running)
                {
                    SafeFileHandle clientHandle = CreateNamedPipe(
                        server.PipeName,
                        (uint)server.PipeType,
                        0,
                        255,
                        BUFFER_SIZE,
                        BUFFER_SIZE,
                        0,
                        IntPtr.Zero);

                    //could not create named pipe
                    if (clientHandle.IsInvalid)
                    {
                        throw new InvalidOperationException("Unable to create pipe");
                    }

                    int success = ConnectNamedPipe(clientHandle, IntPtr.Zero);

                    //could not connect client
                    if (success == 0)
                    {
                        throw new InvalidOperationException("Unable to connect pipe to client");
                    }

                    Client client = new Client();
                    client.handle = clientHandle;
                    client.server = server;

                    lock (server._clients)
                    {
                        server._clients.Add(client);
                    }

                    Thread readThread = new Thread(new ParameterizedThreadStart(ClientPollingThread));
                    readThread.IsBackground = true;
                    readThread.Name         = "Named pipe client thread";
                    readThread.Start(client);
                }
            }
            finally
            {
                server.Running = false;
            }
        }
        public NamedPipesEngineCommunication()
        {
            _instanceIdentifier = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
            _readServer = new NamedPipesServer(@"\\.\pipe\AGSEditorDebuggerGameToEd" + _instanceIdentifier.ToString(), NamedPipeType.Read);
            _writeServer = new NamedPipesServer(@"\\.\pipe\AGSEditorDebuggerEdToGame" + _instanceIdentifier.ToString(), NamedPipeType.Write);
            _readServer.MessageReceived += new NamedPipesServer.MessageReceivedHandler(_server_MessageReceived);
            _readServer.Start();
            _writeServer.Start();

            _messageSender = new Thread(new ThreadStart(MessageSenderThread));
            _messageSender.Name = "MessageSender thread";
            _messageSender.Start();
        }
        public NamedPipesEngineCommunication()
        {
            _instanceIdentifier          = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();
            _readServer                  = new NamedPipesServer(@"\\.\pipe\AGSEditorDebuggerGameToEd" + _instanceIdentifier.ToString(), NamedPipeType.Read);
            _writeServer                 = new NamedPipesServer(@"\\.\pipe\AGSEditorDebuggerEdToGame" + _instanceIdentifier.ToString(), NamedPipeType.Write);
            _readServer.MessageReceived += new NamedPipesServer.MessageReceivedHandler(_server_MessageReceived);
            _readServer.Start();
            _writeServer.Start();

            _messageSender      = new Thread(new ThreadStart(MessageSenderThread));
            _messageSender.Name = "MessageSender thread";
            _messageSender.Start();
        }
        private void _server_MessageReceived(NamedPipesServer.Client client, string message)
        {
            if (message == "MSGACK")
            {
                _expectingAck = false;
                return;
            }

            // We use a separate thread to send the messages to avoid deadlocks
            // waiting to get the MSGACK
            _messageQueue.Enqueue(message);
        }