线程间操作无效: 从不是创建控件的线程访问它

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;
            }));
            */
 
        }    
 }
原文地址:https://www.cnblogs.com/Rannie/p/3979043.html