zoukankan      html  css  js  c++  java
  • 跨线程修改UI控件

    1.直接修改, 失败引发异常.

    namespace Test
    {
        public partial class frmVisitControl : Form
        {
            public frmVisitControl()
            {
                InitializeComponent();
            
            }       

            private void SetLabelText()
            {
                label1.Text = "Hello";
            }
          
            private void btnVisitLabel_Click(object sender, EventArgs e)
            {
                //以下这句将引发InvalidOperationException
                Thread th = new Thread(SetLabelText);
              
                th.Start();
            }
        }
    }

    2.使用代理, 调用UI控件的invoke方法修改, 成功.

    namespace Test
    {
        public partial class frmVisitControl : Form
        {
            public frmVisitControl()
            {
                InitializeComponent();
            
            }

            private void SetLabelText()
            {          
                label1.Text = "Hello";
            }

            delegate void delabc();
            public void setText()
            {
                delabc a = SetLabelText;
                label1.Invoke(a, null);
            }
          
            private void btnVisitLabel_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(setText);           
                th.Start();
            }
        }
    }

    3.使用c#2.0提供的匿名(代理)方法,省一点代码.

    namespace Test
    {
        public partial class frmVisitControl : Form
        {
            public frmVisitControl()
            {
                InitializeComponent();
            
            }

            delegate void delabc();
            public void setText()
            {
                delabc a = delegate() { label1.Text = "Hello"; };

                label1.BeginInvoke(a);
            }
          
            private void btnVisitLabel_Click(object sender, EventArgs e)
            {
                //以下这句将引发InvalidOperationException
                Thread th = new Thread(setText);
              
                th.Start();
            }
        }
    }

    4.使用c#3.5, 4.0中的Action委托, 连代理声明那句都省了.

    namespace Test
    {   
        public partial class frmVisitControl : Form
        {
            public frmVisitControl()
            {
                InitializeComponent();
            }

            public void setText()
            {
                Action a = delegate() { label1.Text = "Hello"; };
                label1.BeginInvoke(a);
            }

            private void btnVisitLabel_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(setText);
                th.Start();
            }
        }
    }

    注释:Action委托,用来封装一个方法,该方法不具有参数并且不返回值。 与之对应的是Func委托,它可以有返回值.

  • 相关阅读:
    mysql 添加索引 mysql 如何创建索引
    给MongoDB添加索引
    Istio流量管理实现机制深度解析
    Oracle E-Business Suite R12.1.x Installation And Upgrade Guide Step by Step
    XXX 不是当前用户的有效责任,请联系您的系统管理员
    EBS报错FRM-92095:Oracle JInitiator版本太旧,请安装版本1.1.8.2或更高版本
    Oracle 表类型变量的使用
    Oracle物化视图
    Oracle EBS
    Oracle释放高水位线
  • 原文地址:https://www.cnblogs.com/liuzhendong/p/2186211.html
Copyright © 2011-2022 走看看