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

    多线程操作界面控件内容, 会出现线程间操作无效,从不是创建控件“xxx”的线程访问它。这个异常来源于.NET2的一个限制:工作线程(包括timer控件)不能访问窗口线程创建的控件

    需要InvokeRequired需要比较调用线程ID和创建线程ID,让主线程调用一个委托(delegate或者Action)来更新控件内容,而不是线程来更新

            // 代理实现异步调用以设置TextBox控件text属性
            //delegate void SetTextCallback(string text);
            private void SetText(string text)
            {
                // InvokeRequired需要比较调用线程ID和创建线程ID
                // 如果它们不相同则返回true
                if (this.lblLeftTime.InvokeRequired)
                {
                    Action ac = new Action(() => { lblLeftTime.Text =text; });
                    this.Invoke(ac);
                    //SetTextCallback d = new SetTextCallback(SetText);
                    //this.Invoke(d, new object[] { text }); //这里执行后。则InvokeRequired就为false。因为此时已经是主线程访问当前创建的控件
    
                }
                else
                {
                    this.lblLeftTime.Text = text;
                }
            }
            private void tmLeftTime_Tick(object sender, EventArgs e)
            {
                var text = ((timeGetTime() - workersStartTime[0])/1000f).ToString("#0.0");
                SetText(text);
            }
  • 相关阅读:
    js语法
    页面格式与布局
    css样式标签
    框架
    css样式表选择器
    最大值(东方化改题+老师给的题解)
    数字(东方化改题+老师给的正解)
    测试一下这个编辑器
    请让本题永远沉睡于此(东方化改题+给的标程)
    贪吃的yjj(东方化改题+给的标程)
  • 原文地址:https://www.cnblogs.com/zitjubiz/p/14059631.html
Copyright © 2011-2022 走看看