private void button4_Click(object sender, EventArgs e){DataGetThreads[0] = new Thread(new ThreadStart(DataGet));DataGetThreads[0].Start();}public void DataGet(){timerDraw.Interval = 200;timerDraw.Start();//MessageBox.Show("如果加上这句")①}private void timerDraw_Tick(object sender, EventArgs e){MessageBox.Show("已开始定时");②}从按下button4开始, 为什么如果我没有写①这句语句,系统就不会执行②这句语句,系统没有反应;如果我写了①这句,执行结果是弹出“如果加上这句”这个窗口,然后无限地弹出“已开始定时”?很不解,为什么加了一句话定时器就工作,没加就不工作?是不是多线程和定时器有冲突?

========================================================================================

timer控件引用的是Sytem.Windows.Forms.Timer类。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。所以说Sytem.Windows.Forms.Timer是工作在UI线程上的。 而你的例子并不是, 你把Timer实例工作在了另外一个你自己创建的Thread中而不是UI线程中。这就解释了为什么不能工作的原因。也就是说timer控件适合单线程环境。你在这里应该用Sytem.Timers.Timer类。详情:https://msdn.microsoft.com/zh-cn/library/system.windows.forms.timer(VS.80).aspxhttps://msdn.microsoft.com/zh-cn/library/system.timers.timer.aspx参考:https://social.msdn.microsoft.com/Forums/sqlserver/zh-CN/857bf39e-e5b1-49d5-af72-58c157fd841d/timertimer

查看原文