我正在编写一个简单的C#程序,尝试使用System.Forms.Timer每隔x秒执行一次操作
tick事件调用一个方法来启动一个新线程并禁用定时器,然后当线程完成其工作时,它再次启用定时器,但问题是,现在它在启用后没有打勾
static System.Windows.Forms.Timer testtimer = new System.Windows.Forms.Timer();
static void Main()
{
testtimer.Tick += testtimertick;
testtimer.Interval = 5000;
testtimer.Enabled = true;
testtimer.Start();
while (true)
{
Application.DoEvents(); //Prevents application from exiting
}
}
private static void testtimertick(object sender, System.EventArgs e)
{
testtimer.Enabled = false;
Thread t = new Thread(dostuff);
t.Start();
}
private static void dostuff()
{
//Executes some code
testtimer.Enabled = true; //Re enables the timer but it doesn't work
testtimer.Start();
}
答案 0 :(得分:3)
不使用没有GUI的GUI计时器。不要与DoEvents
一起旋转,因为你正在使用它来燃烧100%的CPU核心。使用System.Threading.Timer
。它会起作用。
答案 1 :(得分:2)
您可以使用System.Threading.Timer
执行您想要执行的操作,使用Change
Method设置时间和句点,只需在完成工作后重新启动即可。
class Program
{
static System.Threading.Timer testtimer;
static void Main(string[] args)
{
testtimer = new System.Threading.Timer(testtimertick);
testtimer.Change(5000,0);
Console.ReadLine();
}
private static void testtimertick(object sender)
{
Thread t = new Thread(dostuff);
t.Start();
}
private static void dostuff()
{
//Executes some code
Thread.Sleep(2000);
Console.WriteLine("Tick");
testtimer.Change(5000, 0);
}
}
答案 2 :(得分:1)
Windows窗体控件不是线程安全的,您应该确保在UI线程上使用它们,请参阅例如C# Windows Forms Application - Updating GUI from another thread AND class?
答案 3 :(得分:1)
static System.Windows.Forms.Timer testtimer = new System.Windows.Forms.Timer();
static void Main()
{
testtimer.Tick += testtimertick;
testtimer.Interval = 5000;
testtimer.Enabled = true;
while (true)
{
Application.DoEvents(); //Prevents application from exiting
}
}
private static void testtimertick(object sender, System.EventArgs e)
{
Thread t = new Thread(dostuff);
t.Start();
}
private static void dostuff()
{
testtimer.Enabled = false;
//Executes some code
testtimer.Enabled = true; //Re enables the timer but it doesn't work
testtimer.Start();
}
答案 4 :(得分:0)
我刚才有类似的问题。我正在禁用计时器并在需要时再次启用。 下次启用时,它将无效。
我想在每次要启用时禁用和创建新实例时尝试处理Timer对象。虽然没用。
然后找出解决方案。我正在删除在testtimer.Tick中配置的事件,然后在我想启用计时器时将其添加回来。
因此,内部的计时器将始终使用有效值进行实例化,并使其属性Enabled = true。唯一的区别是,只要滴答事件触发,它就不会有任何实际执行的内容。
这会模仿禁用和启用计时器,并使其像你控制的那样工作,如Enabled = false / true。
答案 5 :(得分:0)
如果你真的想坚持GUI计时器,并从非UI线程启动它,你可以尝试做类似的事情,然后从非UI线程写入GUI。
我知道,这不是理想的解决方案。
this.Invoke((MethodInvoker)delegate
{
refreshTimer.Enabled = true;
refreshTimer.Start();
});