Пример #1
0
        /// <summary>
        /// Listens to client requests and put them to the queue from where the working thread takes them
        /// and notifies the call-backs the pipe input channel.
        /// </summary>
        private void DoListening()
        {
            using (EneterTrace.Entering())
            {
                try
                {
                    // Reconnect the server pipe in the loop.
                    // If the client is not available the thread will wait forewer on WaitForConnection().
                    // When the listening is stopped then the thread is correctly released.
                    while (!myStopListeningRequestFlag)
                    {
                        myPipeServer.WaitForConnection();

                        DynamicStream aDynamicStream = null;
                        try
                        {
                            aDynamicStream = new DynamicStream();

                            // Start thread for reading received messages.
                            EneterThreadPool.QueueUserWorkItem(() =>
                            {
                                while (!myStopListeningRequestFlag && myPipeServer.IsConnected)
                                {
                                    // Read the whole message.
                                    try
                                    {
                                        myMessageHandler(aDynamicStream);
                                    }
                                    catch (Exception err)
                                    {
                                        EneterTrace.Warning(TracedObject + ErrorHandler.DetectedException, err);
                                    }
                                }

                                aDynamicStream.Close();
                            });

                            // Write incoming messages to the dynamic stream from where the reading thread will notify them.
                            if (!myStopListeningRequestFlag && myPipeServer.IsConnected)
                            {
                                // Read the whole message.
                                try
                                {
                                    StreamUtil.ReadToEndWithoutCopying(myPipeServer, aDynamicStream);
                                }
                                catch (Exception err)
                                {
                                    EneterTrace.Warning(TracedObject + ErrorHandler.DetectedException, err);
                                }
                            }
                        }
                        finally
                        {
                            if (aDynamicStream != null)
                            {
                                // Note: Do not close the dynamic stream here!
                                //       There can be data read before the closing and the client can still finish to read them.
                                //aDynamicStream.Close();

                                // Unblock the reading thread that can be waiting for messages.
                                aDynamicStream.IsBlockingMode = false;
                            }
                        }

                        // Disconnect the client.
                        if (!myStopListeningRequestFlag)
                        {
                            myPipeServer.Disconnect();
                        }
                    }
                }
                catch (Exception err)
                {
                    // if the error is not caused by closed communication.
                    if (!myStopListeningRequestFlag)
                    {
                        EneterTrace.Error(TracedObject + ErrorHandler.FailedInListeningLoop, err);
                    }
                }
            }
        }