C # Процесс - Пауза или сон до завершения - PullRequest
2 голосов
/ 07 октября 2010

У меня есть процесс:

Process pr = new Process();
pr.StartInfo.FileName = @"wput.exe";
pr.StartInfo.Arguments = @"C:\Downloads\ ftp://user:dvm@172.29.200.158/Transfer/Updates/";
pr.StartInfo.RedirectStandardOutput = true;
pr.StartInfo.UseShellExecute = false;
pr.StartInfo.
pr.Start();

string output = pr.StandardOutput.ReadToEnd();

Console.WriteLine("Output:");
Console.WriteLine(output);

Wput - клиент загрузки ftp.

В тот момент, когда я запускаю процесс и начинаю загрузку, приложение зависает и выводит консольне покажет до концаЯ думаю, что первая проблема решаема с помощью потока.

Что я хочу сделать, это начать загрузку, делать так, чтобы она делала паузу так часто, читать все, что было сгенерировано (используйте эти данные, чтобы сделать индикатор выполнения и т. Д.) и начните снова.

Какие классы / методы мне следует изучить?

Ответы [ 2 ]

4 голосов
/ 07 октября 2010

Вы можете использовать событие OutputDataReceived для асинхронной печати вывода.Для этого есть несколько требований:

Событие включено во время операций асинхронного чтения на StandardOutput.Чтобы запустить асинхронные операции чтения, необходимо перенаправить поток StandardOutput процесса, добавить обработчик события в событие OutputDataReceived и вызвать BeginOutputReadLine.После этого событие OutputDataReceived сигнализирует каждый раз, когда процесс записывает строку в перенаправленный поток StandardOutput, пока процесс не завершится или не вызовет CancelOutputRead.

Ниже приведен пример этой работы.Он просто выполняет длительную операцию, которая также имеет некоторый вывод (findstr /lipsn foo * на C: \ - ищите «foo» в любом файле на диске C).Вызовы Start и BeginOutputReadLine не являются блокирующими, поэтому вы можете выполнять другие действия, пока выводится консоль из вашего приложения FTP.

Если вы когда-нибудь захотите прекратить чтение с консоли, используйтеCancelOutputRead / CancelErrorRead методы.Кроме того, в приведенном ниже примере я обрабатываю как стандартный вывод, так и вывод ошибок с помощью одного обработчика событий, но вы можете разделить их и по-разному обращаться с ними при необходимости.

using System;
using System.Diagnostics;

namespace AsyncConsoleRead
{
    class Program
    {
        static void Main(string[] args)
        {
            Process p = new Process();
            p.StartInfo.FileName = "findstr.exe";
            p.StartInfo.Arguments = "/lipsn foo *";
            p.StartInfo.WorkingDirectory = "C:\\";
            p.StartInfo.UseShellExecute = false;

            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived);
            p.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceived);

            p.Start();

            p.BeginOutputReadLine();

            p.WaitForExit();
        }

        static void OnDataReceived(object sender, DataReceivedEventArgs e)
        {
            Console.WriteLine(e.Data);
        }
    }
}
1 голос
/ 07 октября 2010

Лучшим методом будет использование библиотек, поддерживающих FTP, а не использование внешних приложений.Если вам не нужно много информации из внешнего приложения и вы не проверяете его результаты, тогда продолжайте.Еще лучше использовать клиентские библиотеки FTP.

Может быть, вы хотели бы видеть библиотеки / документы:

http://msdn.microsoft.com/en-us/library/ms229711.aspx

http://www.codeproject.com/KB/IP/ftplib.aspx

http://www.c -sharpcorner.com / uploadfile / danglass / ftpclient12062005053849am / ftpclient.aspx

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