• 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
  • 相关阅读:
    Boost之使用篇(1)
    Lucene 3.0.0细节初窥(1)深入探索Lucene的consumer与processor
    整理一点关于Lucene的学习资料, 方便自己与别人查看
    使用Lucene 3.0.0的结构遍历TokenStream的内容.
    [原创]如何写一个完善的c++异常处理类
    Lucene 3.0.0 的TokenStream与Analyzer
    Lucene 3.0.0 之样例解析(4)IndexFiles.java
    贝叶斯、概率分布与机器学习
    Lucene用c++重写的详细安排
    Lucene 3.0.0的细节初窥(2)研究在索引过程中的缓存
  • 原文地址:https://www.cnblogs.com/zlp520/p/4064397.html
Copyright © 2020-2023  润新知