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#法式設計有所贊助。