2010-09-02 2 views
0

Я разрабатываю элемент управления для веб-сайта, где пользователь может загрузить свой PDF-файл, и после загрузки третьего инструмента CLI-инструмента запускается для проверки PDF-файла в отношении определенного профиля и создания соответствующего отчет. Указанный инструмент - callas pdfToolbox 4 (доступно здесь http://www.callassoftware.com/callas/doku.php/en:download[ ^])Асинхронный захват с выхода процесса не работает должным образом

Проблема в том, что на моем контроле на веб-сайте мне нужно отобразить в режиме реального времени индикатор выполнения PDF-файла. Все функции AJAX для этой функции уже написаны (ajax-postbacks, обновления индикатора выполнения и т. Д.), Но есть проблема с асинхронными обновлениями процесса, который запускает инструмент проверки PDF.

Если вы запустите инструмент из окна командной строки, вы увидите, что он генерирует вывод в стандартный выходной поток, который содержит обновления выполнения (в процентах), а также возможные сообщения об ошибках в PDF-файле.

Однако, если инструмент запускается процессом, который я создаю в своем веб-контроле, я не получаю события OutputDataReceived до тех пор, пока проверка не будет завершена, а затем многие события OutputDataReceived приходят сразу, один за другим ,

Мой код выглядит следующим образом (я написал небольшое консольное-приложение, чтобы проверить вещи быстрее):

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); 
     } 
} 

Как я уже говорил, все выходные данные из Каллас CLI приходит сразу в конце (в то время как проверка занимает около 35 секунд). Чтобы проверить свой собственный код, я создал небольшое консольное приложение, которое выводит номера 10-20-30 -....- 100 с интервалом в 500 миллисекунд, и его вывод отображается отлично от основного приложения, 500 мс.

Любые идеи?

+0

нет идей? кто угодно? :( – Trogvar

+0

Все это также зависит от того, как именно ** вы вызываете утилиту 'pdftoolbox4.exe'. Заверните ее в команду' cmd/c', например 'cmd/c pdftoolbox4.exe ... [params ] '?? –

+0

нет, я не использую cmd/c , в моем случае это прямой путь к исполняемому с параметрами после – Trogvar

ответ

1

Вы должны смыть и printfs стандартные выводы без буферизации, чтобы получить их, как они получают напечатаны на консоли ...

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

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

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