C# winform窗體假死


C#  winform窗體假死

  我們經常會遇到當執行一個比較大的函數時,窗體會出現假死的現象,給用戶的體驗不是很好,於是我們遇到了問題,那么就必須解決,我們該如何解決呢,首先在自己的腦里畫個問號,接下來我們就一起研究吧!

先分析,這個問題是如何出現的呢!為什么會出現,如何避免出現,避免不了的,如何解決等,下面我們就去解決問題吧,遇到問題不要怕,解決問題是我們成長最快的時候,曾經別人告訴我,不怕不會做,就怕想不到。那我們就進入正題吧!

窗體假死是如何出現的呢?

    在調用    testc();函數時,阻塞了UI線程,所以會出現窗體假死現象。(你在吃飯就不能去買東西。) 

問題找到了,接下來我們就要想如何解決呢!

    思路:1.你在吃飯的時候就不能去買東西,所以我們就必須先吃完飯,再去買。(調用DoEvents函數;主動調用Application.DoEvents 會有線程安全問題。)

   思路:2.我可以找個人去幫我買東西。這就是委托,委托一個人去幫你買東西。(新開一個線程)

 切記:沒有必要的時候,請盡可能的少用線程。線程不易控制。

方案一:調用方法:DoEvents

Application.DoEvents();

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       
        private void button1_Click(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            this.label1.Text = "aaaaa";
            Application.DoEvents();
            testc();
        }

        private void testc()
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(10000);
                MessageBox.Show("a");
            }
        }
    }
View Code

 

方案二:新開一個線程;

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
       
        private void button1_Click(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;
            this.label1.Text = "aaaaa";
         
            Thread tr = new Thread(testc);
            tr.Start();
        }

        private void testc()
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(10000);
                MessageBox.Show("a");
            }
        }
    }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM