webForumDet fria alternativet

Timer-problem

.NET

1 svar · 228 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

Jag har en winform där jag har följande kod:

private Timer Clock;
public void LoadUser(int userid)
{
	//.....kod
	this.StartClock();
}
private void Form1_Load(object sender, System.EventArgs e)
{
	CheckForUpdate(false);
	Clock = new Timer();
}
private void Timer_Tick(object sender, System.EventArgs e)
{
	this.StopClock();
	Kundregister.Controls.LasningPopUp f = new Kundregister.Controls.LasningPopUp();
	f.ShowDialog(this);
}
public void StartClock()
{
	this.Clock.Interval=1200000;
	this.Clock.Tick+=new EventHandler(Timer_Tick);
	this.Clock.Start();		
}
public void StopClock()
{
	this.Clock.Stop();		
}
public void CloseUser()
{
	//...kod
	MessageBox.Show("Kunden har stängts!");
}

Kundregister.Controls.LasningPopUp ser ut så här:

private int i=0;
private Timer Clock;
private void LasningPopUp_Load(object sender, System.EventArgs e)
{
		i = 20;
		Clock = new Timer();
		this.StartClock();
}
private void StartClock()
{
	i = 20;
	this.Clock.Start();
	this.Clock.Interval=1000;
	this.Clock.Tick+=new EventHandler(Timer_Tick);
}
private void Timer_Tick(object sender, System.EventArgs e)
{
	i=i-1;
	lblLasning.Text = i.ToString()+ " sekunder";
	if(i==0)
	{
		this.StopClock();
		this.Close();
		((Form1)this.Owner).CloseUser();
	}
}
private void StopClock()
{
	this.Clock.Stop();
}
private void ultraButton2_Click(object sender, System.EventArgs e)
{
	this.StopClock();
	this.Close();
	((Form1)this.Owner).CloseUser();
}

private void ultraButton1_Click(object sender, System.EventArgs e)
{
	this.StopClock();
	this.Close();
	((Form1)this.Owner).StartClock();
}

Av någon konstig anledning så kommer fönstret LasningPopUp upp på nytt ibland när man klickar på ultraButton2 eller när i==0, ibland kommer det upp 5 ggr på raken. Har testat allt möjligt men nu kan jag inte se nått som kan orsaka att det poppar upp igen.
Nån som kan Timern och vet vad orsaken kan vara?

Medlem sedan dec. 19996 721 inlägg
#2

Felet är att du lägger till event-delegaten

this.Clock.Tick+=new EventHandler(Timer_Tick);

...i en metod som kan köras flera gånger.

Varje gång StartClock körs så kommer en ny delegat att läggas till på Tick-eventet, och med andra ord körs Timer_Tick-metoden flera gånger på raken (dock väntar den på att LasningPopUp stängs, eftersom den öppnas modalt.)

Flytta den ovanstående raden hit:

Clock = new Timer();
Clock.Tick+=new EventHandler(Timer_Tick);

259 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)