2010-09-02 4 views
0

Je développe un contrôle pour un site Web, où l'utilisateur peut télécharger son fichier PDF, et après le téléchargement d'un outil CLI tiers lance pour vérifier PDF contre certains profil et générer un correspondant rapport. L'outil mentionné est callas pdfToolbox 4 (disponible ici http://www.callassoftware.com/callas/doku.php/en:download[ ^])La capture asynchrone à partir d'une sortie de processus ne fonctionne pas correctement

Le problème est que sur mon contrôle sur le site Web, j'ai besoin d'afficher en temps réel la barre de progression de la vérification du fichier PDF. Tout le matériel AJAX pour cette fonctionnalité est déjà écrit (ajax-postbacks, mises à jour de barre de progression, etc), mais il y a un problème avec les mises à jour asynchrones du processus, qui lance l'outil de vérification de pdf. Si vous lancez l'outil à partir de la fenêtre de ligne de commande, vous pouvez voir qu'il génère une sortie dans le flux de sortie standard, qui contient des mises à jour (en pourcentages), ainsi que des messages d'erreurs dans le fichier PDF.

Cependant, si l'outil est lancé par le processus que je crée dans mon contrôle Web, je ne reçois pas les événements OutputDataReceived tant que la vérification n'est pas terminée, puis de nombreux événements OutputDataReceived arrivent à la fois .

Mon code est le suivant (je l'ai écrit une petite console app pour tester les choses plus vite):

class Program 
{ 

     static string appString = "path-to-callas-cli"; 
     static string argString = "path-to-pdf-and-path-to-report-and-path-to-callas-profile"; 

     static void Main(string[] args) 
     { 
      ProcessStartInfo pInfo = new ProcessStartInfo(appString, argString); 
      pInfo.UseShellExecute = false; 
      pInfo.CreateNoWindow = true; 
      pInfo.RedirectStandardOutput = true; 
      pInfo.RedirectStandardError = true; 
      pInfo.RedirectStandardInput = true; 
      pInfo.ErrorDialog = true; 

      Process process = new Process(); 
      process.StartInfo = pInfo; 
      process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
      process.Exited += new EventHandler(process_Exited); 
      process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived); 
      process.Start(); 

      process.BeginOutputReadLine(); 
      process.BeginErrorReadLine(); 

      process.WaitForExit(); 

      Console.ReadKey(); 
     } 

     static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
     { 

     } 

     static void process_Exited(object sender, EventArgs e) 
     { 
     } 

     static void process_OutputDataReceived(object sender, DataReceivedEventArgs e) 
     { 
      Console.WriteLine("Received async output: " + e.Data); 
     } 
} 

Comme je l'ai dit, toutes les sorties de Callas CLI est à la fois à la fin (alors que la vérification prend environ 35 secondes). Pour tester mon propre code, j'ai créé une petite application de console, qui produit les numéros 10-20-30 -....- 100 par intervalles de 500 millisecondes, et sa sortie est affichée parfaitement à partir de l'application principale, à venir avec Intervalles de 500 ms.

Des idées?

+0

aucune idée? n'importe qui? :( – Trogvar

+0

Tout dépend aussi de ** comment exactement ** vous invoquez l'utilitaire 'pdftoolbox4.exe' Vous l'intégrez dans une commande' cmd/c', comme 'cmd/c pdftoolbox4.exe ... [params ] ' –

+0

non, je n'utilise pas le cmd/c dans mon cas, c'est le chemin droit à l'exécutable avec params après – Trogvar

Répondre

1

Vous devez rincer les stdouts et printfs sans mise en mémoire tampon pour les recevoir comme ils sont imprimés sur la console ...

Voir C equivalent of autoflush (flush stdout after each write)?

Je saccagé une journée à essayer de nous en sortir alors pensé que je partager la solution pour toutes les personnes dans la même situation ...

Questions connexes