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