Как получить полностью результат из оболочки в процессе асинхронизма? - PullRequest
0 голосов
/ 20 мая 2010

обратитесь к этим постам: здесь1 и здесь2 наконец я решаю свою проблему путем построения асинхронного решения, и оно работает хорошо !!! но есть проблема, с которой я сталкиваюсь, теперь мой код выглядит так:

class MyProcessStarter
    {
        private Process process;
        private StreamWriter myStreamWriter;
        private static StringBuilder shellOutput = null;
        public String GetShellOutput { get { return shellOutput.ToString(); }}

        public MyProcessStarter(){
            shellOutput = new StringBuilder("");
            process = new Process();            
            process.StartInfo.FileName = "sqlplus";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;
            process.OutputDataReceived += new DataReceivedEventHandler(ShellOutputHandler);

            process.StartInfo.RedirectStandardInput = true;
            process.StartInfo.RedirectStandardOutput = true;
            //process.StartInfo.RedirectStandardError = true;
            process.Start();
            myStreamWriter = process.StandardInput;
            process.BeginOutputReadLine();
        }

        private static void ShellOutputHandler(object sendingProcess,DataReceivedEventArgs outLine)
        {
            if (!String.IsNullOrEmpty(outLine.Data))
                shellOutput.Append(Environment.NewLine + outLine.Data);
        }

        public void closeConnection()
        {
            myStreamWriter.Close();
            process.WaitForExit();
            process.Close(); 
        }

        public void RunCommand(string arguments)
        {
            myStreamWriter.WriteLine(arguments);
            myStreamWriter.Flush();
            process.WaitForExit(100);
            Console.WriteLine(shellOutput);
            Console.WriteLine("============="+Environment.NewLine);
            process.WaitForExit(2000);
            Console.WriteLine(shellOutput);            
        }
    } 

и мой ввод такой:

 myProcesStarter.RunCommand("myusername/mypassword");
 Console.writeline(myProcesStarter.GetShellOutput);

но взгляните на мой выход:

SQL*Plus: Release 11.1.0.6.0 - Production on Thu May 20 11:57:38 2010
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
=============


SQL*Plus: Release 11.1.0.6.0 - Production on Thu May 20 11:57:38 2010
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
Enter user-name: 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

как видите, выходные данные для запуска функции не одинаковы в разное время! Так что теперь вы бы мне помогли и помогли мне понять, как я могу ждать, пока все результаты не будут выполнены в другом, означает, как я могу настроить свой процесс так, чтобы дождаться окончания вывода ?? потому что я хочу написать sqlcompiler, поэтому мне нужен точный вывод shell.

Пожалуйста, помогите мне в ближайшее время. Thanxxxxxxxxxxxx: X

1 Ответ

1 голос
/ 05 апреля 2011

Вы должны использовать параметр -S в SQL * Plus. Согласно справке, этот параметр

Устанавливает бесшумный режим, который подавляет отображение баннера SQL * Plus, подсказки и отображение команд.

В идеале это должно обеспечить согласованность результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...