Синхронные команды C# при запуске внешних программ
Мне дали задание перекодировать кучу видеофайлов GoToMeeting каждый вечер. После того как видео перекодировано, оно будет загружено на веб-сайт. Однако, прежде чем я углублюсь в проект, я хотел выяснить, возможно ли это вообще.
Мой текущий пример сценария представляет собой простой командный файл, куда я могу перетащить несколько файлов в командный файл. Он перекодирует первый файл, отображает вывод и затем переходит ко второму файлу для перекодирования. Это ожидаемое поведение, которое я ищу.
@echo off
C:\g2mtranscoder.exe source=%~1
echo %~1 has completed.
C:\g2mtranscoder.exe source=%~2
echo %~2 has completed.
C:\g2mtranscoder.exe source=%~3
echo %~3 has completed.
C:\g2mtranscoder.exe source=%~4
echo %~4 has completed.
pause
Мой вопрос заключается в том, что если в C# (в конечном итоге это будет служба Windows), это будет так же просто, как вызов внешней программы g2mtranscoder.exe
сделать транскодирование и затем поставить мой скрипт загрузки сразу после этого? Очевидно, что я не хотел бы загружать видео, которое в данный момент транскодируется, и не хотел бы, чтобы видео загружалось без предварительной транскодировки.
Мой вопрос заключается в том, не помещает ли это в цикл (для каждого файла в каталоге) какие-либо проблемы, если содержимое каталога содержит только ожидающие транскодирования видео? Если в цикле, попытается ли он перебрать и запустить транскодирование всех файлов в каталоге асинхронно или это будет более синхронно? Я бы хотел избежать асинхронного зацикливания цикла, так как это может привести к перегрузке машины, вызывая артефакты или проблемы синхронизации с синхронизацией аудио / видео. Самое важное, что видео во время транскодирования или нетранслированное видео не может быть загружено.
Любые предложения по кодированию для этого были бы хорошими, но я действительно хочу больше понять, как C# работает с выполнением кода, когда внешняя программа вызывается в середине исполняемого кода C#.
Я больше разбираюсь в Ruby / Rails и Linux и не очень разбираюсь в C#. Я знаю достаточно, чтобы быть опасным, но просто хочу убедиться, что то, что я ищу, возможно.
1 ответ
Я понял. Я могу создать процесс, а затем использовать флаг HasExited, чтобы дождаться завершения процесса. После завершения я могу продолжить загрузку программы. Успешный выход будет иметь HasExited
ценность 0
тогда как неудачный выход будет 1
или же -1
,
StartInfo.Arguments
позволит мне пройти в source=<location of GTM video>
обработать видео файл.
Console.WriteLine("Running");
Process pr = new Process();
pr.StartInfo.FileName = "Notepad.exe";
pr.StartInfo.Arguments = "test.dat";
pr.Start();
while (pr.HasExited == false)
if ((DateTime.Now.Second % 5) == 0)
{ // Show a tick every five seconds.
Console.Write(".");
System.Threading.Thread.Sleep(1000);
}