2012-04-27 207 views
0

當用戶按下我的表單中的關閉按鈕時,我正在執行一段代碼,通過消息框停止進程(java.exe)。因此,如果按下「是」按鈕,程序將掃描所有正在運行的進程並檢查進程是否正在運行。如果該進程沒有運行,則kill該應用程序。C#while循環onclose

問題是消息彈出多次。 發生這種情況是因爲他一直激活關閉事件,但我不知道如何以正確的方式對其進行編碼。

if (_isRunning) 
{ 
    if (MessageBox.Show("Are you sure you want to quit?", "Confirm Quit", MessageBoxButtons.YesNo) == 
     DialogResult.Yes) 
    { 
     Stop(); 
     _exited = true; 

     foreach (Process x in Process.GetProcesses()) 
     { 
      while (x.Id == _processID) 
      { 
       Application.Exit(); 
       e.Cancel = true; 
       return; 
      } 
     } 
    } 
} 

任何想法?

+0

怎麼樣的用戶激活關閉事件多次?不是對話框模態? – Jeff 2012-04-27 18:43:47

回答

0

如何在按下後禁用關閉按鈕(或整個表單)?這樣,用戶就不會看到明顯啓用的「關閉」按鈕,它沒有任何用處。

通常,在如此長的時間內阻止用戶輸入是一個壞主意......如果操作需要超過1秒的時間才能完成,那麼可能需要放置一個進度條。

此外,您使用Application.Exit()看起來很腥。你想在foreach區塊中完成什麼?

另見How do I properly close a winforms application in C#?

0

既然你在消息循環的時候,你可以防止多個調用,無需多線程的麻煩:

private bool _isClosing = false; 

void Form_Closing(object sender, EventArgs e) { 
    if (_isClosing) return; 

    _isClosing = true; 
    if (_isRunning) { 
     // ....Clean up code.... 
    } 
    _isClosing = false; 
} 
+0

就我個人而言,我認爲禁用「關閉」按鈕並向用戶提供某種進度條(如果關閉事件將花費大於1秒)是一種更好的用戶體驗。否則,用戶留下一個無效的關閉按鈕。 – 2012-04-27 18:45:20