Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Асинхронный вывод из консоли.


Автор: Keannad 25.2.2008, 12:30
У меня есть программа... Небольшая оболочка для консольного рара, которая запускает его с выбранными параметрами (сводит процесс архивирования до нескольких кликов и параметры как бы являются эталонными...).

Так вот запускаю "rar.exe" через "Process" в отдельном потоке (чтоб не вешало форму) с перенаправлением консольного вывода в программу на C#. Мне нормально приходят строки "добавление файла", информация", но когда дело доходит до бегущих  процентов - мне возвращается строка типа "добавлени ... /b/b/b/b 0% /b/b/b/b 5% ...." И так далее, и получаю я её когда архивирование собственно закончилось...

Можно как либо вывести эту строчку на на форму чтоб проценты бежали? Или уже никак?

Автор: Yama 29.2.2008, 15:08
Делаешь синхронизацию с твоей формой, StreamReader'ом вычитываешь строки и после этого выводишь их в нужный тебе контрол.

Автор: Keannad 1.3.2008, 13:25
Ты имеешь в виду это?
Код

stdoutreader = procces.StandardOutput;
Encoding windows1251 = Encoding.GetEncoding("windows-1251");
while ((stdoutline = stdoutreader.ReadLine()) != null)
 {
//мой код
}


Повторюсь... Строка возвращается типа "добавлени ... /b/b/b/b 0% /b/b/b/b 5% ...." И так далее, и получаю я её когда архивирование собственно закончилось...

Автор: WERITAS 1.3.2008, 17:05
Доброго времени суток. Можно попробовать как-нибудь так
Код

FileStream fs = new FileStream(....);
byte[] mass = new byte[fs.length];
.......................
IAsyncResult arg = fs.BeginRead(mass, 0, mass.Length, null, null);
while(!arg.IsCompleted)
{
Console.WriteLine("Work in progress!"); // Во время чтения файла будет выводиться "Work in progress!"
..............
}

Приведите ваш код, чтоб было понятнее как его лучше исполнить в асинхронном режиме.

Автор: Keannad 2.3.2008, 10:01
Весь код процедуры выполняемый вторым потоком...

Код

        private void BW1_DoWork(object sender, DoWorkEventArgs e)
        {
            Winrar options = (Winrar)e.Argument;
            Process procces = null;
            ProcessStartInfo processinfo;
            OperatingSystem os;
            string command, stdoutline;
            StreamReader stdoutreader;
            Encoding utf8 = Encoding.GetEncoding("utf-8");
            command = options.CreateString() + options.GetFileWithInfo;
            try
            {
                os = Environment.OSVersion;
                if (os.Platform != PlatformID.Win32NT)
                {
                    os = null;
                    throw new PlatformNotSupportedException("Требуется Windows NT или выше");
                }
                if (command == null || command.Trim().Length == 0)
                {
                    throw new ArgumentNullException("command");
                }
                processinfo = new ProcessStartInfo();
                processinfo.FileName = options.GetRarPath;
                processinfo.Arguments = command;
                processinfo.UseShellExecute = false;
                processinfo.RedirectStandardOutput = true;
                processinfo.CreateNoWindow = true;
                procces = Process.Start(processinfo);
                stdoutreader = procces.StandardOutput;
                Encoding windows1251 = Encoding.GetEncoding("windows-1251");
                while ((stdoutline = stdoutreader.ReadLine()) != null)
                {
                    byte[] srcByte = windows1251.GetBytes(stdoutline);
                    string temp = windows1251.GetString(Encoding.Convert(Encoding.GetEncoding("cp866"), windows1251, srcByte));
                 // здесь сторка должна выводиться в какой либо контрол...
                }
                BW1.ReportProgress(100);
                stdoutreader.Close();
                stdoutreader = null;
            }
            catch
            {
                throw;
            }
            finally
            {
                if (procces != null)
                {
                    procces.Close();
                }
                procces = null;
                processinfo = null;
            }
            e.Result = 0;
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)