国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中登錄窗體和歡迎窗體關閉方法分析

2019-10-29 21:47:18
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C#中登錄窗體和歡迎窗體關閉方法,實例分析了C#中登錄窗體和歡迎窗體關閉時出現錯誤的原因與解決方法,是C#項目開發中非常實用的技巧,需要的朋友可以參考下
 

本文實例分析了C#中登錄窗體和歡迎窗體關閉方法。分享給大家供大家參考。具體分析如下:

在c#的winform編程中,我們經常會做登錄窗體或歡迎窗體,并把他們作為啟動窗體。
 
但是,我們有可能會遇到一些問題。
 
請看下面的代碼:

復制代碼代碼如下:
private void button1_Click(object sender, EventArgs e)
{
    this.Close();
    new Form2().Show();
}

這段代碼想讓form1中的button1在點擊后關閉form1,show出form2,但是目的沒有達到,form2是show出來了,但僅僅是一閃,便和關閉的form1一同消失了。
 
這是怎么回事呢?讓我們從,Main方法里找答案。這是自動生成的Main方法:
復制代碼代碼如下:
static void Main()
{
    Application.EnableVisualStyles();//啟用可視樣式
    Application.SetCompatibleTextRenderingDefault(false);//將某些控件的UseCompatibleTextRendering設為默認值
    Application.Run(new Form1());//這是關鍵
}

我們看到這一句
復制代碼代碼如下:
Application.Run(new Form1());

這是什么意思呢?這是要在沒有窗體的情況下,在當前線程上開始運行標準應用程序消息循環,并顯示這個窗體。
 
也就是說,要在一個沒有窗體的線程上顯示一個窗體,使這個線程不結束。
 
回過來,在button1的點擊事件中,我們show出來的form2又是什么情況呢?這個form2是存活在一個新的線程上的,所以這兩個窗體才不會相互阻塞。
 
那么問題來了,為什么把form1關掉,form2也會關掉呢?
 
原因是,form2所在的線程,是show它的線程的附屬線程,在這里就是說,form2的線程屬于form1的線程。在form1關閉的時候,form1所在的線程也就結束,連帶著,就把他的所有附屬線程也都結束掉了,form2所在的線程自然也不例外,所以form2也會隨之關閉。
 
知道了原因,那么我們就來思考解決的方案。Application.Run();好像很牛的樣子,我們來試試它行不行。
 
改變后的button1代碼如下:
復制代碼代碼如下:
private void button1_Click(object sender, EventArgs e)
{
    this.Close();
    Application.Run(new Form2());
}

可是運行結果是報錯

 

這是怎么回事呢?這是因為在form1所在的線程上已經運行著一個form了,運行著標準應用程序消息循環,所以就不能在這個線程上再開啟一個新循環,顯示一個新form了。
 
既然這個線程不能再來個form了,那我們就換個線程試試!最終的button1的點擊事件代碼如下

復制代碼代碼如下:
private void button1_Click(object sender, EventArgs e)
{
    this.Close();

 

    new System.Threading.Thread(() =>
    {
 Application.Run(new Form2());

    }).Start();
}

 

希望本文所述對大家的C#程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 钟祥市| 淄博市| 开封市| 舒城县| 皮山县| 南昌县| 姚安县| 大连市| 灵山县| 嘉禾县| 濮阳县| 池州市| 太湖县| 察哈| 旬邑县| 绥江县| 奉新县| 轮台县| 大安市| 吕梁市| 易门县| 雷州市| 长白| 山阳县| 乌鲁木齐县| 安徽省| 龙陵县| 商水县| 大竹县| 林周县| 福海县| 镇沅| 乐山市| 永胜县| 禹城市| 沈阳市| 卢氏县| 南平市| 新郑市| 杭锦后旗| 汝城县|