C#中多线程和定时器是不是有冲突?
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).aspx
https://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