嗨我已经介入了一些与计时器有关的问题。 希望有人能帮忙..
Thread thread1 = new Thread(new ParameterizedThreadStart( execute2));
thread1.Start(externalFileParams);
public void execute2(Object ob)
{
if (ob is ExternalFileParams)
{
if (boolean_variable== true)
executeMyMethod();//this also executes very well if condition is true
else
{
timer1.enabled = true;
timer1.start();
}
}
}
}
5但计时器的tick事件未被触发
我正在研究VS2008 3.5框架。我已经从工具箱拖动计时器并将其Interval
设置为300也试图设置Enabled
true / false
方法是timer1_Tick(Object sender , EventArgs e)
但是没有解雇
任何人都可以建议我做错了吗?
答案 0 :(得分:18)
您可以尝试以这种方式启动计时器:
在表单构造函数中添加:
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
// Set the Interval to 1 second.
aTimer.Interval = 1000;
将此方法添加到Form1:
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
//do something with the timer
}
按钮点击事件添加:
aTimer.Enabled = true;
此计时器已经过线程化,因此无需启动新线程。
答案 1 :(得分:6)
MatíasFidemraizer说的确如此。但是,有一项工作......
如果您的表单上有一个可调用的控件(例如状态栏),则只需调用该控件!
C#代码示例:
private void Form1_Load(object sender, EventArgs e)
{
Thread sampleThread = new Thread(delegate()
{
// Invoke your control like this
this.statusStrip1.Invoke(new MethodInvoker(delegate()
{
timer1.Start();
}));
});
sampleThread.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("I just ticked!");
}
答案 2 :(得分:3)
System.Windows.Forms.Timer在单线程应用程序中工作。
检查此链接:
备注说:
计时器用于举起活动 用户定义的间隔。这个Windows 计时器专为一个 UI的单线程环境 线程用于执行 处理。它需要用户 代码有一个UI消息泵可用 并始终以相同的方式运作 线程,或编组调用 另一个线程。
阅读更多“备注”部分,您会发现Microsoft建议您使用此计时器将其与UI线程同步。
答案 3 :(得分:0)
我会使用BackgroundWorker(而不是原始线程)。主线程将订阅worker RunWorkerCompleted event:当线程完成时,事件将在主线程中触发。使用此事件处理程序重新启动计时器。