C#ThreadStart VS ProcessStartInfo()

时间:2016-05-16 10:20:18

标签: c#

早上好, 在我的应用程序中,我以这种方式使用特定的录音软件:

//OLD CODE

ProcessStartInfo start = new ProcessStartInfo();
start.Arguments = arguments;
start.FileName = "PROGRAM FOR RECORDING AUDIO";
start.WindowStyle = ProcessWindowStyle.Normal;
start.CreateNoWindow = true;

//use timer
runTimer();
using (Process proc = Process.Start(start))
{
     proc.WaitForExit();
}

//Create mp3 and other operations
work();

当我退出此程序时,我的应用程序会创建mp3并执行其他操作。在录制过程中,该程序每分钟创建一次文件并用日期和时间命名。 我想更新应用程序表单中的列表框,添加创建的新mp3文件的名称。 为此,我使用了一个计时器:

public void runTimer()
{
    aTimer.Elapsed += new ElapsedEventHandler(RunEvent);
    aTimer.Interval = 10000;
    aTimer.Enabled = true;*/

    int timeout = Timeout.Infinite;
    int interval = 10000;
    TimerCallback callback = new TimerCallback(RunEvent);

    System.Threading.Timer timer = new System.Threading.Timer(callback, null, timeout, interval);
    timer.Change(0, 10000);
}

public void RunEvent(object state)
{
    //search file and update listbox
}

但只有在退出录音软件时,列表框才会更新。 我用以下代码更改了旧代码:

//TEST
Process pr = new Process();
ProcessStartInfo prs = new ProcessStartInfo();
prs.FileName = "PROGRAM FOR RECORDING AUDIO";
pr.StartInfo = prs;

ThreadStart ths = new ThreadStart(delegate() { pr.Start(); });
Thread th = new Thread(ths);
th.Start();

通过这种方式,列表框可​​以正确更新。 但是我不知道如何处理录音软件的闭包以便使用我的旧代码中的work()方法。抱歉我的英文不好;)

1 个答案:

答案 0 :(得分:0)

您可以使用异步操作。例如:

//use timer
//runTimer(); //Not needed now
Task.Factory.StartNew(() => {
    using (Process proc = Process.Start(start))
    {
        proc.WaitForExit();
    }
    work(); //If you need to wait  the process to finish
});
work(); //If you don't need to wait  the process to finish