淺析c#中登入表單和歡迎表單關閉的問題

來源:互聯網
上載者:User

標籤:des   winform   style   blog   io   ar   color   os   sp   

第一次在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();        }

在這裡,我建立了一個線程,並在這個線程裡run了form2,開啟新的應用程式迴圈,結果正如我們所料,成功運行,form2show出,form1關閉。

總結一下:

一個線程只能跑一個form,

 Application.Run()可以當前線程上開始運行標準應用程式訊息迴圈。

要想再開啟一個不受原來表單影響的表單,

需要開啟新的線程。

在新的線程裡,

 Application.Run()

這在登入表單和歡迎表單中會很有用

淺析c#中登入表單和歡迎表單關閉的問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.