.Net不允许跨线程直接调用窗体控件,原因是如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。 还可能会出现其他与线程相关的 Bug,例如争用情况和死锁。
两种解决方案:
(1)不进行系统安全检查
Control.CheckForIllegalCrossThreadCalls = false;
(2)委托
private delegate void TickClient(object sender, ElapsedEventArgs e); void Tick(object sender, ElapsedEventArgs e) { if (labelSurplusShow.InvokeRequired) { TickClient tc = new TickClient(Tick); labelSurplusShow.Invoke(tc, new object[] {sender,e}); } else { labelSurplusShow.Text = last.ToString("xxxxxxx"); } }