我的代码中有Windows.Forms.Timer
,我正在执行3次。但是,计时器根本没有调用tick功能。
private int count = 3;
private timer;
void Loopy(int times)
{
count = times;
timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
count--;
if (count == 0) timer.Stop();
else
{
// Do something here
}
}
正在从代码中的其他位置调用 Loopy()
。
答案 0 :(得分:40)
尝试使用System.Timers而不是Windows.Forms.Timer
void Loopy(int times)
{
count = times;
timer = new Timer(1000);
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
throw new NotImplementedException();
}
答案 1 :(得分:6)
如果在不是主UI线程的线程中调用方法Loopy(),则计时器不会打勾。
如果要从代码中的任何位置调用此方法,则需要检查InvokeRequired
属性。所以你的代码应该是这样的(假设代码是在一个表单中):
private void Loopy(int times)
{
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
Loopy(times);
});
}
else
{
count = times;
timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
}
答案 2 :(得分:2)
我不确定你做错了什么看起来是正确的,这段代码有效:看看它与你的比较。
public partial class Form1 : Form
{
private int count = 3;
private Timer timer;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Loopy(count);
}
void Loopy(int times)
{
count = times;
timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
count--;
if (count == 0) timer.Stop();
else
{
//
}
}
}
答案 3 :(得分:2)
这是一个有效的Rx代码:
Observable.Interval(TimeSpan.FromSeconds(1))
.Take(3)
.Subscribe(x=>Console.WriteLine("tick"));
当然,您可以在程序中订阅更有用的内容。
答案 4 :(得分:1)
如果您使用的是Windows.Forms.Timer,则应使用以下内容。
//Declare Timer
private Timer _timer= new Timer();
void Loopy(int _time)
{
_timer.Interval = _time;
_timer.Enabled = true;
_timer.Tick += new EventHandler(timer_Elapsed);
_timer.Start();
}
void timer_Elapsed(object sender, EventArgs e)
{
//Do your stuffs here
}
答案 5 :(得分:0)
检查是否在属性中启用了计时器。 我的是假的,设置为真后就可以了。
答案 6 :(得分:0)
如果您使用一些小于计时器内部间隔的延迟,则system.timer将执行其他线程,并且您必须处理同时运行的双线程。应用InvokeRequired来控制流程。