Как дождаться завершения процесса, прежде чем продолжить выполнение - C # - PullRequest
2 голосов
/ 02 декабря 2010

Итак, я запускаю кучу процессов для преобразования некоторых аудиофайлов, и я хочу, чтобы моя основная программа подождала завершения всех этих процессов, прежде чем выполнить.

        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 ]

3 голосов
/ 02 декабря 2010

Есть некоторые проблемы, которые сделают ваш код практически непригодным для использования:

  1. Запуск столько процессов, сколько у вас есть файлов - большой нет-нет. Вы загрузите свой процессор и в итоге получите все преимущества своей супер-многоядерной машины. Основное правило: до 2 процессов на ядро. Это хорошо согреет процессор.
  2. Фрагментация диска. Запись сразу до 100 файлов сделает ваш жесткий диск настолько фрагментированным, что он быстро заклинит.
  3. Повторное использование объекта Process: опять же, плохо. Если вы хотите это так: создайте один экземпляр Process в цикле и сохраните его в каком-то списке List. Если вы действительно придерживаетесь идеи «запустить все сразу» - запустите их, сохраните их в списке, затем выполните итерацию списка и дождитесь завершения каждого из них!
  4. Создание процессов с последующим запросом списка процессов из системы и поиском их по имени - почему, когда вы их создали в первую очередь?

EDIT:

Как ты мог это сделать:

  • выясните, сколько у вас процессорных ядер
  • создать массив в два раза больше
  • в цикле foreach:
    • определить, есть ли у вас место в вашем массиве (любой из процессов имеет значение null)
    • если так - создайте новый процесс, поместите его в массив
    • если нет, цикл: проверьте (неблокирующее), завершен ли какой-либо из ваших процессов; первый, то есть, установите его в нуль (внутри массива) - если ничего не сделано, немного поспите (мое магическое число - 350 - вы выбираете свое)
3 голосов
/ 02 декабря 2010

внутри if, попробуйте

pprocess.WaitForExit();
break;

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

Этот код будет ждать до завершения процесса, а затем прервать работу с foreach, что позволит вашей основной программе продолжить работу.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...