Я разрабатываю элемент управления для веб-сайта, где пользователь может загрузить свой 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 мс.
Любые идеи?
нет идей? кто угодно? :( – Trogvar
Все это также зависит от того, как именно ** вы вызываете утилиту 'pdftoolbox4.exe'. Заверните ее в команду' cmd/c', например 'cmd/c pdftoolbox4.exe ... [params ] '?? –
нет, я не использую cmd/c , в моем случае это прямой путь к исполняемому с параметрами после – Trogvar