1. 程式人生 > >c#關閉窗體的四種方法

c#關閉窗體的四種方法

關閉窗體的四種方法

1. close():指僅關閉當前窗體,如果不是主窗體(包含主執行緒的窗體,並非MDI窗體)的話,是無法退出整個程式的。如果有託管執行緒也無法退出。 
  此方法會呼叫 dispose() 方法,所以它會自動的幫我們釋放記憶體,除了以下兩種情況:(1)該窗體是多文件應用程式(MDI)的一部分並且此窗體不可見;(2)此窗體是“模態”窗體。 
  close() 方法執行的時候會觸發兩個事件:Form_Closing 和 Form_Closeed 事件,Form_Closing 是在窗體關閉時執行,Form_Closed 是在窗體關閉之後執行,所以如果想取消關閉窗體,可以在 Form_Closing 事件裡取消。

2. Application.Exit(): 強制所有訊息中止,退出所有的窗體,但是若有託管執行緒(非主執行緒),也無法乾淨地退出。

3. Application.ExitThread(): 強制中止呼叫執行緒上的所有訊息,同樣面臨其它執行緒無法正確退出的問題。

4. System.Environment.Exit(0); 這是最徹底的退出方式,不管什麼執行緒都被強制退出,把程式結束的很乾淨。 引數0:代表程式正常退出;引數1:代表程式非正常退出。

close() 和 dispose() 的區別

 close():這個方法會自動呼叫 dispose()方法。 
 dispose():這個方法的作用是釋放元件使用的所有資源,.NET 提供的垃圾自動回收機制,可以幫我們自動回收垃圾物件,可是垃圾回收器只能回收“託管資源”,而不能回收“非託管資源”,而且垃圾回收器也並不是立即回收,而是每隔一段時間才會回收一次,每次回收的時間我們都不知道。 
 所以 dispose() 方法是為了彌補這種機制所產生的方法,呼叫 dispose(true) 方法可以釋放“託管”和“非託管”資源,而且它可以不必等待垃圾回收器來自動釋放,呼叫此方法可以顯示釋放資源。

Form.show() 和 Form.ShowDialog() 的區別

From.Show():窗體顯示出來的是非模態窗體 
From.ShowDialog():窗體顯示出來的是模態窗體,而且點選窗體右上角的關閉按鈕時,它不是呼叫 close() 方法,而是呼叫 hide() 方法。所以它並不是真正的關閉,再呼叫此方法窗體還會出現。而非模態窗體,點選關閉的時候,會呼叫 close() 方法,再次呼叫 Show() 方法,就會報錯,因為窗體物件已被釋放。

託管資源 和 非託管資源

託管資源:由CLR管理分配和釋放的資源,即由CLR裡new出來的物件 
非託管資源:不受CLR管理的物件,windows核心物件,如檔案、資料庫連線、套接字、COM物件等

如果某型別使用到了非託管資源,那麼,就需要讓此型別繼承介面IDisposable。需要顯示釋放資源,因為垃圾回收器並不會回收非託管資源。

 

=================

關閉當前窗體開啟另一個窗體

//可以先開啟form2,再關閉form1
button1_Click()
{
   form2 frm2 = new form2();
   frm2.show();
   this.close();
}