多线程操作界面控件内容, 会出现线程间操作无效,从不是创建控件“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);
        }

 

posted on 2020-11-30 09:37  Gu  阅读(1050)  评论(0编辑  收藏  举报