程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 淺析c#中登錄窗體和歡迎窗體關閉的問題

淺析c#中登錄窗體和歡迎窗體關閉的問題

編輯:C#入門知識

淺析c#中登錄窗體和歡迎窗體關閉的問題


第一次在cnbogs發文章,這次來個很基礎的,主要給小白看。   在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();         }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved