在继续执行之前如何等待进程终止 - C#

时间:2010-12-02 06:55:42

标签: c# multithreading process

所以我启动了一堆进程来转换一些音频文件,我希望我的主程序等到所有这些进程完成后再执行。

        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo stratInfo = new System.Diagnostics.ProcessStartInfo();
        stratInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        DirectoryInfo di = new DirectoryInfo(@dir);
        foreach (FileInfo fi in di.GetFiles())
            {
                stratInfo.FileName = "C:\\AudioExtract.exe";
                stratInfo.Arguments = "-a \"" + dir + "\\" + fi.Name + "\"";
                process.StartInfo = stratInfo;
                process.Start();
            }
                foreach (Process clsProcess in Process.GetProcesses())
                {
                    if (clsProcess.ProcessName.Contains("AudioExtract.exe"))
                    {
                        StatusLbl.Text = "Found!";
                    }
                }

这就是我必须看到它是否正在运行,但我需要它继续更新getprocesses并检查它是否仍在运行并且我不太确定如何。

我的应用程序几乎同时为不同的音频文件启动许多相同的过程。我查看了注释中的链接,这将设置一个事件处理程序,每当其中一个进程退出时,我将如何处理许多相同的事件?

2 个答案:

答案 0 :(得分:3)

在if中,尝试

pprocess.WaitForExit();
break;

http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx

该代码将等待该进程退出,然后从您的foreach中断,允许您的主程序继续运行。

答案 1 :(得分:3)

有些问题会使您的代码几乎无法使用:

  1. 尽可能多地处理文件 - 大禁忌。你会拥挤你的CPU并且不会获得你的超级多核机器的任何好处。经验法则:每个核心最多2个进程。这对处理器来说很温暖。
  2. 磁盘碎片。一次写入100个文件会使您的硬盘驱动器如此碎片化,您可能会立刻窒息。
  3. 重用Process对象:再次,坏事。如果你想这样:在循环中创建一个Process实例,并将其存储在某种List中。如果你真的坚持“一次全部运行”的想法 - 运行它们,将它们存储在一个列表中,然后迭代列表并等待每一个完成!
  4. 创建流程,然后从系统中询问流程列表并按名称搜索 - 为什么首先创建它们?
  5. 编辑:

    你怎么做:

    • 调查您拥有的CPU核心数
    • 创建两倍大的数组
    • 在foreach循环中,执行以下操作:
      • 确定您的数组中是否有位置(任何进程为空)
      • 如果是这样 - 创建新进程,将其放入数组
      • 如果不是,循环:检查(非阻塞)是否有任何进程完成;第一个是,将它设置为null(在数组内) - 如果没有完成,请稍微睡一下(我的幻数是350 - 你选择自己的)