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


    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;
                }));
                */
     
            }    
     }
  • 相关阅读:
    Shell编程进阶 1.2 shell结构及执行
    LNMP 1.6 常见的502问题解决
    关于贴图看不到。显示是白色或者其他。
    windows 任务栏图标宽度固定
    Install Oracle Java JDK/JRE 7u55 on Fedora 20/19, CentOS/RHEL 6.5/5.10
    盘点天龙历史:七年以来所有资料片
    linux shell 逻辑运算符、逻辑表达式详解
    vim 把满足条件的数字进行加上一些数字
    win7 一些快捷系统工具命令
    Linux下用C读取配置文件。类似ini这样。
  • 原文地址:https://www.cnblogs.com/Rannie/p/3979043.html
Copyright © 2020-2023  润新知