C#中登錄窗體和歡迎窗體關(guān)閉方法分析
本文實例分析了C#中登錄窗體和歡迎窗體關(guān)閉方法。分享給大家供大家參考。具體分析如下:
在c#的winform編程中,我們經(jīng)常會做登錄窗體或歡迎窗體,并把他們作為啟動窗體。
但是,我們有可能會遇到一些問題。
請看下面的代碼:
{
this.Close();
new Form2().Show();
}
這段代碼想讓form1中的button1在點擊后關(guān)閉form1,show出form2,但是目的沒有達(dá)到,form2是show出來了,但僅僅是一閃,便和關(guān)閉的form1一同消失了。
這是怎么回事呢?讓我們從,Main方法里找答案。這是自動生成的Main方法:
{
Application.EnableVisualStyles();//啟用可視樣式
Application.SetCompatibleTextRenderingDefault(false);//將某些控件的UseCompatibleTextRendering設(shè)為默認(rèn)值
Application.Run(new Form1());//這是關(guān)鍵
}
我們看到這一句
這是什么意思呢?這是要在沒有窗體的情況下,在當(dāng)前線程上開始運(yùn)行標(biāo)準(zhǔn)應(yīng)用程序消息循環(huán),并顯示這個窗體。
也就是說,要在一個沒有窗體的線程上顯示一個窗體,使這個線程不結(jié)束。
回過來,在button1的點擊事件中,我們show出來的form2又是什么情況呢?這個form2是存活在一個新的線程上的,所以這兩個窗體才不會相互阻塞。
那么問題來了,為什么把form1關(guān)掉,form2也會關(guān)掉呢?
原因是,form2所在的線程,是show它的線程的附屬線程,在這里就是說,form2的線程屬于form1的線程。在form1關(guān)閉的時候,form1所在的線程也就結(jié)束,連帶著,就把他的所有附屬線程也都結(jié)束掉了,form2所在的線程自然也不例外,所以form2也會隨之關(guān)閉。
知道了原因,那么我們就來思考解決的方案。Application.Run();好像很牛的樣子,我們來試試它行不行。
改變后的button1代碼如下:
{
this.Close();
Application.Run(new Form2());
}
可是運(yùn)行結(jié)果是報錯
這是怎么回事呢?這是因為在form1所在的線程上已經(jīng)運(yùn)行著一個form了,運(yùn)行著標(biāo)準(zhǔn)應(yīng)用程序消息循環(huán),所以就不能在這個線程上再開啟一個新循環(huán),顯示一個新form了。
既然這個線程不能再來個form了,那我們就換個線程試試!最終的button1的點擊事件代碼如下
{
this.Close();
new System.Threading.Thread(() =>
{
Application.Run(new Form2());
}).Start();
}
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
C#使用MiniExcel實現(xiàn)導(dǎo)入導(dǎo)出數(shù)據(jù)到Excel/CSV文件
MiniExcel是一個簡單、高效避免OOM的.NET處理Excel查、寫、填充數(shù)據(jù)的工具,這篇文章主要介紹了C#如何使用MiniExcel實現(xiàn)導(dǎo)入導(dǎo)出數(shù)據(jù)到Excel/CSV文件,需要的可以參考下2024-02-02
C#結(jié)合JavaScript實現(xiàn)多文件上傳功能
在許多應(yīng)用場景里,多文件上傳是一項比較實用的功能,本文主要為大家詳細(xì)介紹了C#如何結(jié)合JavaScript實現(xiàn)多文件上傳功能,感興趣的小伙伴可以了解下2023-12-12
C#基于Linq和反射實現(xiàn)數(shù)據(jù)持久化框架Xml4DB詳解
在本篇文章里小編給大家整理的是關(guān)于C#基于Linq和反射實現(xiàn)數(shù)據(jù)持久化框架Xml4DB相關(guān)知識點,有需要的朋友們學(xué)習(xí)下。2019-08-08

