Пример #1
0
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

        public void ProcessStdout(object sendingProcess, DataReceivedEventArgs args)
        {
            if (!string.IsNullOrEmpty(args.Data))
            {
                LoggingUtils.Print(string.Format("[JdbClient] ProcessStdout: {0}", args.Data));

                try
                {
                    m_timeSinceLastOperation.Restart();

                    if (args.Data.Equals("Initializing jdb ..."))
                    {
                        m_sessionStarted.Set();
                    }

                    //
                    // Distribute result records to registered delegate callbacks.
                    //

                    OnAsyncStdout(new string [] { args.Data });

                    //
                    // Collate output for any ongoing async commands.
                    //

                    lock (m_asyncCommandData)
                    {
                        foreach (KeyValuePair <uint, AsyncCommandData> asyncCommand in m_asyncCommandData)
                        {
                            if (!asyncCommand.Value.Command.StartsWith("-"))
                            {
                                asyncCommand.Value.OutputLines.Add(args.Data);
                            }
                        }
                    }

                    //
                    // Call the corresponding registered delegate for the token response.
                    //

                    uint token = m_sessionCommandToken;

                    AsyncCommandData callbackCommandData = null;

                    lock (m_asyncCommandData)
                    {
                        if (m_asyncCommandData.TryGetValue(token, out callbackCommandData))
                        {
                            m_asyncCommandData.Remove(token);
                        }
                    }

                    //
                    // Spawn any registered callback handlers on a dedicated thread, as not to block JDB output.
                    //

                    if ((callbackCommandData != null) && (callbackCommandData.OutputDelegate != null))
                    {
                        ThreadPool.QueueUserWorkItem(delegate(object state)
                        {
                            try
                            {
                                callbackCommandData.OutputDelegate(callbackCommandData.OutputLines.ToArray());
                            }
                            catch (Exception e)
                            {
                                LoggingUtils.HandleException(e);
                            }
                        });
                    }
                }
                catch (Exception e)
                {
                    LoggingUtils.HandleException(e);
                }
            }
        }