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;
                }));
                */
     
            }    
     }
  • 相关阅读:
    学习方式的反省
    我又辞职了!
    mysql完全备份,增量备份及恢复脚本
    marquee.js jQuery 多功能无缝滚动插件
    ul与li应用样式及其兼容性
    闲谈 JavaScript 之事件绑定(转载自万戈)
    JavaScript 中万变不离其宗的 this 应用场景
    ScrollUp – 超轻量的可定制的回到顶部 jQuery 插件
    jQuery之Tab切换代码改进
    jQuery Unveil – 另一款非常轻量的延迟加载插件
  • 原文地址:https://www.cnblogs.com/Rannie/p/3979043.html
Copyright © 2011-2022 走看看