我正在尝试创建一个搜索字符串的Windows窗体应用程序,它有三种可能的场景:
我只是在期待等待的时候遇到我的问题。发生这种情况时,newTimer_Tick开始每秒都打勾。我已经尝试在计时器和其他一些东西时禁用计时器,但似乎都没有。以下是代码:
public void Action(string result)
{
if (result.Contains("string1"))
{
// Check again in 10 + x seconds
int n = new Random().Next(0, 5000);
int newtime = 10000 + n;
newTimer.Tick += new EventHandler(newTimer_Tick);
newTimer.Interval = newtime;
newTimer.Enabled = true;
}
else if (result.Contains("string2"))
{
// Turn off
newTimer.Enabled = false;
}
else
{
// Perform action and tick again in 1min + x seconds
action1();
int n = new Random().Next(0, 5000);
int newtime = 600000 + n;
newTimer.Tick += new EventHandler(newTimer_Tick);
newTimer.Interval = newtime;
newTimer.Enabled = true;
}
}
private void newTimer_Tick(object sender, EventArgs e)
{
Action( result );
}
我做错了什么?
答案 0 :(得分:5)
每次调用以下行时,事件处理程序 newTimerTick 的新实例都会添加到Tick事件的调用列表中:
newTimer.Tick += new System.EventHandler(newTimer_Tick);
因此,每当时间标记响起时, newTimerTick 将被多次调用,这将给您带来意想不到的结果。
仅配置一次事件处理程序。在构造函数中将是一个明智的地方。
答案 1 :(得分:0)
答案 2 :(得分:0)
我认为你缺少的是你必须停止你的计时器,因为你实际上并不希望它保持一个以上的间隔。您似乎想要运行一次,检查结果,然后决定是否要继续运行它。这是代码:
public void action(string result)
{
int n = new Random().Next(0, 5000);
Boolean blActivateTimer = true;
Timer timer = new Timer();
timer.Tick += timer_Tick;
if (!result.Contains("string1") && !result.Contains("string2"))
{
n += 600000;
action1();
}
else
{
if (result.Contains("string1"))
{
n += 10000;
}
else
{
blActivateTimer = false;
}
}
if (blActivateTimer)
{
timer.Start();
}
}
void action1()
{
}
void timer_Tick(object sender, EventArgs e)
{
Timer t = (Timer)sender;
t.Stop();
action(result);
}