2011-09-28 44 views
1

我有一個程序,啓動另一個程序(iexplore.exe),然後我的程序應該「隱形」或atlast到背景,並保持這個asd。 exe正在運行。此代碼正在工作,但它吃內存,有時它只是保持隱藏,而asd.exe不再運行。必須有這樣做更有效的方式=) 所以我的程序代碼:如何發送我的程序到背景,而某個過程正在運行

this.Hide(); 
    Process.Start(Path.Combine(Path, "iexplore.exe")); 
    Process[] Running_ = null; 
    do 
    { // this loops eats memory! 
     System.Threading.Thread.Sleep(500); 
     Running_ = null; 
     Running_ = Process.GetProcessesByName("iexplore"); 
    }while (Running_.Length > 0); 
    this.Show(); 

回答

4

你希望在這裏使用Process.Exited事件,防止阻塞UI線程並避免線程混亂。像這樣:

private void button1_Click(object sender, EventArgs e) { 
     var prc = new Process(); 
     prc.EnableRaisingEvents = true; 
     prc.Exited += processExited; 
     prc.StartInfo = new ProcessStartInfo("notepad.exe"); 
     prc.Start(); 
     this.Hide(); 
    } 

    private void processExited(object sender, EventArgs e) { 
     this.BeginInvoke(new Action(() => { 
      this.Show(); 
      this.BringToFront(); 
     })); 
    } 
+0

像魅力一樣工作,非常感謝你的先生! :P –

+0

從未使用過Exited事件。絕對好,如果它的廣告作品! –

0

你需要調用Dispose()您的數組中的每個對象上,然後它停止吃內存。

我的意思,而不是WoWRunning_ = null;把有什麼樣foreach(Process p in WoWRunning_) p.Dispose();

但無論如何你的算法應當修改完全,因爲你一次又一次地加載所有進程的數組是相當昂貴的。

+0

謝謝,現在我知道如何處理這些事情。 –

1
  • 不需要WoWRunning_ null。 Process.GetProcessesByName無論如何改變參考
  • 調用.Dispose()!
3

那麼Process.WaitForExit方法呢?

this.Hide(); 
Process p = Process.Start(Path.Combine(WoWPath, "asd.exe")); 
p.WaitForExit(); 
this.Show(); 
+0

禁止UI線程是不合法的。窗口經理非常不健康。 –

+0

你是對的。我只是想展示一種更簡單的方法來實現與來自galaris的代碼相同(甚至更少的錯誤)結果。如果我使用這個,我會在自己的線程中執行它,而不是在UI線程中執行。 – MatthiasG

3

我喜歡什麼MatthiasG已經完成,但WaitForExit()是一個阻塞調用...你的程序將被隱藏,直到asd.exe執行完畢,但你的程序不會做任何富有成效。

這可能是期望的結果。如果沒有,我會

  1. 隱藏窗體 - >this.Hide();
  2. 創建一個線程(BackgroundWorker的就足夠了)......在DoWork的()事件,創建ASD進程對象(如MatthiasG的所作所爲):

    Process p = Process.Start(Path.Combine(WoWPath, "asd.exe")); 
    p.WaitForExit(); 
    
  3. 在RunWorkerCompleted事件,有this.Show();

+0

我同意。在使用Process.WaitForExit方法或任何其他線程阻塞操作時,使用BackgroundWorker(或新線程)是不可或缺的。 – MatthiasG

+0

謝謝你的支持,但我認爲Hans Passant提供了一個更有效的方法。無論如何感謝幫助。 –

+0

對我來說,他們是兩種不同的做法。 Hans所展示的是Process類有一個內置的Event,名爲Exited。這是有效的,當它被提出時,你可以做任何你想做的事情。我的解決方案需要一個單獨的線程來完成同樣的事情,並使用它自己的Event。他們兩人都使用事件。這完全取決於您希望如何完成解決方案。漢斯的解決方案看起來更乾淨,這絕對是我學到的新東西! –

相關問題