2010-10-07 2 views
2

У меня есть процесс:C# Процесс - Пауза или сон до завершения

Process pr = new Process(); 
pr.StartInfo.FileName = @"wput.exe"; 
pr.StartInfo.Arguments = @"C:\Downloads\ ftp://user:[email protected]/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-клиент для загрузки.

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

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

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

ответ

4

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

Событие включено во время асинхронных операций чтения по стандарту. Чтобы начать асинхронные операции чтения, вы должны перенаправить поток 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

Лучшим методом было бы использовать библиотеки, которые поддерживают 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

+0

К сожалению, я должен использовать wput.exe. – nf313743

+0

Грустный, но ответ Криса тоже хорош! – Nayan

Смежные вопросы