2012-06-18 19 views
0

我需要爲指定目錄中的每個PDF文件運行一個外部程序。如何設置程序可以同時啓動的最大外部進程數?

問題是 - 如何限制外部程序進程數爲用戶指定的值?我在循環中運行它,就像這樣:

foreach(string file in Directory.GetFiles(sourcePath)) 
{ 
    Process p = new Process(); 
    p.StartInfo.FileName = @"path\program.exe"; 
    p.StartInfo.Arguments = previouslySetArguments; 
    p.Start(); 
} 

現在的問題是,有時是一個非常龐大的文件量和代碼,所有的進程將在同一時間跑了。它確實減慢了機器的速度。

其他想法是把p.WaitForExit();p.Start();後,但隨後會在時間,這在另一方面只運行一個進程 - 減慢整個工作:)

什麼是限制的過程最簡單的方法號碼在同一時間運行它們的確切數量?我想讓用戶決定。

假設我想一次運行最多5個進程。因此:
- 前5個進程或多或少地同時啓動目錄中的前5個文件
- 當其中一個(無所謂,哪個)結束工作時,下一個開始 - 爲下一個文件

+0

可能重複的[菌種過程,但只有5在時刻](http://stackoverflow.com/questions/4360720/spawn-processes-but-only-5-at-a-time) –

+0

什麼版本的.Net? –

+0

@AustinSalonen - 爲什麼.NET的版本很重要? –

回答

0

OK,所以我想答案從this question,但 - 奇怪的事情 - 我無法讓他們工作。我承認,我很着急,可能犯了一些錯誤......

現在,我發現的最快最簡單的(和最醜陋的)方法只是一個循環,就像下面的代碼一樣。它可以與測試程序一起使用,該程序只需要用給定的命令行參數調用Thread.Sleep()即可達到毫秒。現在

請給我解釋一下,爲什麼它不是一個很好的解決方案 - 我認爲這是不正確的方式(不僅是因爲代碼是醜陋的),即使它與該試驗例。

class Program 
{ 
    // hardcoded, it's just a test: 
    static int activeProcesses = 0; 
    static int finishedProcesses = 0; 
    static int maxProcesses = 5; 
    static int runProcesses = 20; 

    static string file = @"c:\tmp\dummyDelay.exe"; 

    static void Main(string[] args) 
    { 
     Random rnd = new Random(); 

     while (activeProcesses + finishedProcesses < runProcesses) 
     { 
      if (activeProcesses < maxProcesses) 
      { 
       Process p = new Process(); 
       p.EnableRaisingEvents = true; 
       p.Exited += new EventHandler(pExited); 
       p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
       p.StartInfo.FileName = file; 
       p.StartInfo.Arguments = rnd.Next(2000, 5000).ToString(); 
       p.Start(); 
       Console.WriteLine("Started: {0}", p.Id.ToString()); 
       activeProcesses++; 
      } 
     } 

    } 

    static void pExited(object sender, EventArgs e) 
    { 
     Console.WriteLine("Finished: {0}", ((Process)sender).Id.ToString()); 
     ((Process)sender).Dispose(); 
     activeProcesses--; 
     finishedProcesses++; 
    } 
} 
相關問題