zoukankan      html  css  js  c++  java
  • 线程间操作无效: 从不是创建控件的线程访问它

    public partial class Form1 : Form
        {
            private delegate void DelegateSetText(string text);
            private void SetText(string text)
            {
                if (this.txtMessage.InvokeRequired)
                {
                    Invoke(new DelegateSetText(SetText), text);
                }
                else
                {
                    this.txtMessage.Text += text;
                }
     
            }
     
            public Form1()
            {
                InitializeComponent();
                //Control.CheckForIllegalCrossThreadCalls = false;
            }
     
            private void btnTest_Click(object sender, EventArgs e)
            {
                var t = Task.Factory.StartNew(() =>
                {
                    Do();
                });
     
            }
         private void Do()
            {
                btnTest.Invoke(new MethodInvoker(delegate() { btnTest.Enabled = false; }));
                txtMessage.Invoke(new MethodInvoker(delegate() { txtMessage.Text = ""; }));
     
                //this.Invoke(new MethodInvoker(() => { btnTest.Enabled = false; }));
                //this.Invoke(new MethodInvoker(() => { txtMessage.Text = ""; }));
                int i = 0;
                while (i < 10)
                {
                    string str = DateTime.Now + ":" + i + "
    ";
                    // 简单代码直接写代理
                    txtMessage.Invoke(new MethodInvoker(delegate() { this.txtMessage.Text += str; }));
                    /////或者使用如下方法,显示声明代理
                    //SetText(str);
                    Thread.Sleep(1000);
                    i++;
                }
     
                btnTest.Invoke(new MethodInvoker(delegate() { btnTest.Enabled = true; }));
                //this.Invoke(new MethodInvoker(() => { btnTest.Enabled = true; }));
     
                /*
                 this.Invoke(new MethodInvoker(() =>
                {
                    btnTest.Enabled = false;
                    txtMessage.Text = "";
     
                    int i = 0;
                    while (i < 10)
                    {
                        string str = DateTime.Now + ":" + i + "
    ";
                        // 简单代码直接写代理
                        txtMessage.Invoke(new MethodInvoker(delegate() { this.txtMessage.Text += str; }));
                        /////或者使用如下方法,显示声明代理
                        //SetText(str);
                        Thread.Sleep(1000);
                        i++;
                    }
                    btnTest.Enabled = true;
                }));
                */
     
            }    
     }
  • 相关阅读:
    s3c2440——按键中断
    s3c2440——swi异常
    S3C2440的七种模式之——未定义模式(去掉bl print1 bug解决)
    Entity Framework DBContext 增删改查深度解析
    Git换行符是如何精确控制的
    Entity Framework 乐观并发处理
    Session, Token and SSO 有什么区别
    2017让我受益最大的那些书--别找了,都在这里
    GDB scheduler-locking 命令详解
    Java web servers 间是如何实现 session 同步的
  • 原文地址:https://www.cnblogs.com/Rannie/p/3979043.html
Copyright © 2011-2022 走看看