c#之關閉窗體的實現(xiàn)方法
c#關閉窗體的方法
關閉窗體的四種方法
1. close():
指僅關閉當前窗體,如果不是主窗體(包含主線程的窗體,并非MDI窗體)的話,是無法退出整個程序的。如果有托管線程也無法退出。
此方法會調用 dispose() 方法,所以它會自動的幫我們釋放內存,除了以下兩種情況:
- (1)該窗體是多文檔應用程序(MDI)的一部分并且此窗體不可見;
- (2)此窗體是“模態(tài)”窗體。
close() 方法執(zhí)行的時候會觸發(fā)兩個事件:Form_Closing 和 Form_Closeed 事件,F(xiàn)orm_Closing 是在窗體關閉時執(zhí)行,F(xiàn)orm_Closed 是在窗體關閉之后執(zhí)行,所以如果想取消關閉窗體,可以在 Form_Closing 事件里取消。
2. Application.Exit():
強制所有消息中止,退出所有的窗體,但是若有托管線程(非主線程),也無法干凈地退出。
3. Application.ExitThread():
強制中止調用線程上的所有消息,同樣面臨其它線程無法正確退出的問題。
4. System.Environment.Exit(0);
這是最徹底的退出方式,不管什么線程都被強制退出,把程序結束的很干凈。 參數(shù)0:代表程序正常退出;參數(shù)1:代表程序非正常退出。
close() 和 dispose() 的區(qū)別
- close():這個方法會自動調用 dispose()方法。
- dispose():這個方法的作用是釋放組件使用的所有資源,.NET 提供的垃圾自動回收機制,可以幫我們自動回收垃圾對象,可是垃圾回收器只能回收“托管資源”,而不能回收“非托管資源”,而且垃圾回收器也并不是立即回收,而是每隔一段時間才會回收一次,每次回收的時間我們都不知道。
所以 dispose() 方法是為了彌補這種機制所產(chǎn)生的方法,調用 dispose(true) 方法可以釋放“托管”和“非托管”資源,而且它可以不必等待垃圾回收器來自動釋放,調用此方法可以顯示釋放資源。
Form.show() 和 Form.ShowDialog() 的區(qū)別
- From.Show():窗體顯示出來的是非模態(tài)窗體
- From.ShowDialog():窗體顯示出來的是模態(tài)窗體,而且點擊窗體右上角的關閉按鈕時,它不是調用 close() 方法,而是調用 hide() 方法。所以它并不是真正的關閉,再調用此方法窗體還會出現(xiàn)。而非模態(tài)窗體,點擊關閉的時候,會調用 close() 方法,再次調用 Show() 方法,就會報錯,因為窗體對象已被釋放。
托管資源 和 非托管資源
- 托管資源:由CLR管理分配和釋放的資源,即由CLR里new出來的對象
- 非托管資源:不受CLR管理的對象,windows內核對象,如文件、數(shù)據(jù)庫連接、套接字、COM對象等
如果某類型使用到了非托管資源,那么,就需要讓此類型繼承接口IDisposable。需要顯示釋放資源,因為垃圾回收器并不會回收非托管資源。
c#彈窗提示并自動關閉方法
剛學C#不久,就寫個工具,總結寫一個簡便自定義提示窗口方法,并自動關閉。
1.在項目添加windows form(非user control),命名為Form_wait。
2.在Form_wait,加入需要控件與一個定時器timer1。
數(shù)字10為計時顯示,10秒后自動默認選擇“是”
timer1 屬性interval 設為1000,即 tick事件1s進入
3.定義Form_wait響應事件:
private void timer1_Tick(object sender, EventArgs e) //1s進入一次 { count -= 1; this.label2.Text = count.ToString(); if(count==0) { this.timer1.Stop(); this.DialogResult = DialogResult.OK; //這里是重點,在主窗口里能讀取返回值 } } private void button1_Click(object sender, EventArgs e) //“是”
{ this.timer1.Stop(); this.DialogResult = DialogResult.OK; } private void button2_Click(object sender, EventArgs e) { this.timer1.Stop(); this.DialogResult = DialogResult.No; }
4.主窗口調用。
Form_wait subform = new Form_wait(15); //15為設定倒時 if (subform.ShowDialog() == DialogResult.No) { MessageBox.Show("跳出控件"); return; }
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內存應用
這篇文章主要介紹了詳解C#中的System.Timers.Timer定時器的使用和定時自動清理內存應用,需要的朋友可以參考下2017-06-06C#使用動態(tài)規(guī)劃解決0-1背包問題實例分析
這篇文章主要介紹了C#使用動態(tài)規(guī)劃解決0-1背包問題,實例分析了C#動態(tài)規(guī)劃算法的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04