我试图了解如何在C#中使用Timer,但我从未真正理解任何教程。 我想得到一个等待一秒然后做某事的循环(不是Thread.Delay。可以在其他事情发生时同时运行的东西)。如果有人可以告诉我如何编写代码或给我一个样本,那个初学者可以理解我会非常感激。
public partial class Char1 : Form
{
private static System.Timers.Timer aTimer;
public static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Mainprog.count += 1;
}
public Char1()
{
InitializeComponent();
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
while (checkBox1.Checked)
{
aTimer.Interval = 2000;
aTimer.Enabled = true;
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
}
}
我试图让它每2秒调用一次事件,但它会崩溃。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
你不应该在while循环中启用计时器,你绝对不应该在while循环中添加eventlistners,因为这就是你的程序崩溃的原因,也是我使用的timer.start(),我不是熟悉timer.enable尝试这样:
public partial class Char1 : Form
{
private System.Timers.Timer aTimer;
public static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Mainprog.count += 1;
}
public Char1()
{
InitializeComponent();
aTimer = new Timer();
aTimer.Interval = 2000;
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if(checkBox1.Checked)
{
aTimer.Start();
}
else
{
aTimer.Stop();
}
}
}
在构造函数中实例化你的计时器,并在那里定义你的间隔,除非你想在选中或取消选中复选框时更改你的间隔。
答案 1 :(得分:1)
现在最简单的方式:
while(true) {
await Task.Delay (1000);
DoSomething ();
}
答案 2 :(得分:1)
您(最近添加的)代码
while (checkBox1.Checked)
{
aTimer.Interval = 2000;
aTimer.Enabled = true;
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
包含一些问题:
+=
)个新的事件处理程序,这样,如果它被触发,您将触发数千个OnTimedEvent
个电话。解决方案:将while
替换为if
,并确保只需将OnTimedEvent添加一次,方法是将该行移动到表单的构造中。
答案 3 :(得分:0)
你可以使用TimerCallback和timer在另一个线程中运行一个方法,如下所示:
TimerCallback tCb = Method;
Timer t = new Timer(tCb, null, 1000, 1000);
}
private void Method(object sender)
{
//your
}
等待一秒钟(dueTime)后,它将每秒(句点)运行一次。