运行外部程序时的C#同步命令

时间:2013-07-25 21:09:47

标签: c# asynchronous synchronous external-process

我每天晚上都要完成转码一堆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 个答案:

答案 0 :(得分:0)

我明白了。我可以创建一个进程,然后使用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);
    }