2010-10-07 6 views
2

J'ai un processus:C# Processus - Pause ou dormir avant la fin

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 est un client de téléchargement ftp.

Au moment où j'exécute le processus et commence le téléchargement, l'application se bloque et la sortie de la console ne s'affiche pas jusqu'à la fin. Je suppose que le premier problème est résolu en utilisant un fil. Ce que je veux faire est de lancer un téléchargement, de le mettre en pause de temps en temps, de lire la sortie générée (utiliser cette barre de progression, etc.) et de recommencer.

Quelles classes/méthodes devrais-je examiner?

Répondre

4

Vous pouvez utiliser l'événement OutputDataReceived pour imprimer la sortie de manière asynchrone. Il existe quelques conditions pour que cela fonctionne:

L'événement est activé pendant les opérations de lecture asynchrones sur StandardOutput. Pour démarrer des opérations de lecture asynchrones, vous devez rediriger le flux StandardOutput d'un processus, ajouter votre gestionnaire d'événements à l'événement OutputDataReceived et appeler BeginOutputReadLine. Par la suite, l'événement OutputDataReceived signale chaque fois que le processus écrit une ligne dans le flux StandardOutput redirigé, jusqu'à ce que le processus se termine ou appelle CancelOutputRead.

Un exemple de ce travail est ci-dessous. Il fait juste une opération de longue durée qui a également une sortie (findstr /lipsn foo * sur C: \ - recherchez "foo" dans n'importe quel fichier sur le lecteur C). Les Start et BeginOutputReadLine appels sont non-blocage, de sorte que vous pouvez faire d'autres choses alors que la sortie de la console de vos rouleaux d'application FTP.

Si jamais vous voulez arrêter la lecture de la console, utilisez les méthodes CancelOutputRead/CancelErrorRead. En outre, dans l'exemple ci-dessous, je gère à la fois la sortie standard et la sortie d'erreur avec un seul gestionnaire d'événements, mais vous pouvez les séparer et les traiter différemment si nécessaire.

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

La meilleure méthode consiste à utiliser des bibliothèques qui prennent en charge FTP au lieu de s'appuyer sur des applications externes. Si vous n'avez pas besoin de beaucoup d'informations de l'application externe et ne vérifiez pas leurs sorties, alors allez-y. Sinon, utilisez mieux les bibliothèques client FTP.

Peut être que vous souhaitez voir libs/Documentations:

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

Malheureusement, je dois utiliser wput.exe. – nf313743

+0

Triste, mais la réponse de Chris est bonne aussi! – Nayan

Questions connexes