Синхронные команды 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);
    }
Другие вопросы по тегам