Я запускаю процесс, который запускает внешний сторонний пакет. Затем я хотел бы запустить таймер, который запускает событие каждые несколько секунд, чтобы отслеживать результаты этого процесса. Вот код, который я использую для запуска процесса:
Process process = new Process();
process.StartInfo.FileName = exe;
process.StartInfo.Arguments = args;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.BeginErrorReadLine();
RuntimeMonitor rtm = new RuntimeMonitor(OutputFile(), InputFile(), 5000);
process.WaitForExit();
rtm.Close();
Конструктор для монитора времени выполнения:
public RuntimeMonitor(string _outfile,
string _title,
double intervalMs) // in milliseconds
{
outFile = outfile;
title = _title;
timer = new System.Timers.Timer();
timer.Interval = intervalMs;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_func);
timer.AutoReset = true;
timer.SynchronizingObject = null;
timer.Start();
}
Симптом, который я получаю, заключается в том, что timer_func не вызывается до тех пор, пока процесс не завершится (т.е. после process.WaitForExit (); завершается). Я думал, что событие прошедшего таймера сработало асинхронно, но, похоже, оно заблокировано
РЕДАКТИРОВАТЬ: ну, это становится незнакомым. Я попытался установить timer.SynchronizingObject в null, но безрезультатно. Я также попытался использовать класс System.Threading.Timer и получил тот же результат.
Еще одна информация. Я делаю вызов, чтобы начать сбор данных из процесса, но не уверен, что это актуально (то есть вызов BeginErrorReadLine в приведенном выше коде)