2010-12-02 56 views
2

因此,我啓動了一堆進程來轉換某些音頻文件,並且我希望我的主程序等到所有這些進程完成後才執行。如何等到某個進程終止後再繼續執行 - C#

 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並檢查它是否仍在運行和IM不太清楚如何。

我的應用程序幾乎同時啓動許多不同的音頻文件的相同過程。我查看了註釋中的鏈接,它將設置一個事件處理程序,如果每次有一個進程退出時,我將如何處理許多相同的事件?

+1

http://stackoverflow.com/questions/2/how-to-know-the-exe-run-by-my-applications-process-has-completed-its-4332123#4332123 – 2010-12-02 06:58:31

+0

已更新我的帖子 – Dacto 2010-12-02 07:04:16

回答

3

有一些問題,這將使你的代碼幾乎無法使用,請與裸露我:

  1. 發射了儘可能多的進程,你所擁有的文件 - 大禁忌。你將擁擠你的CPU,並且會贏得你的超級多核機器的任何好處。經驗法則:每個核心最多2個進程。這將溫暖處理器就好了。
  2. 磁盤碎片。一次寫入100個文件會使您的硬盤碎片化,您很快就會窒息。
  3. 重用過程對象:再次,壞事。如果你想這樣做:在循環中創建一個Process實例,並將其存儲在某種List中。如果你真的堅持'一次全部運行'的想法 - 運行它們,將它們存儲在一個列表中,然後迭代列表並等待每個完成!
  4. 創建進程,然後從系統中詢問進程列表並按名稱搜索它們 - 爲什麼當您首先創建它們?

編輯:

你怎麼能做到這一點:

  • 調查你有多少個CPU內核具有
  • 創建陣列的兩倍大
  • 在foreach循環,這樣做:
    • 確定您是否在陣列中有位置(任何進程爲空)
    • 如果是這樣 - 創建新進程,將其放入數組
    • 如果否,循環:檢查(非阻塞)是否有任何進程完成;第一個是,它設置爲null(數組內) - 如果沒有完成,睡了一小(我的幻數爲350 - 你選擇你自己的)
相關問題