Jahangeer
Jahangeer

Reputation: 154

Unable to stop Timer in C#

Hi all I have used timer class to call an event after a minute here is my code

   public partial class TimerScheduler : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    static void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {

    }
    System.Timers.Timer _timer = new System.Timers.Timer(10000);
    protected void Button1_Click(object sender, EventArgs e)
    {
        _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
        _timer.Enabled = true;
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        _timer.Stop();
        _timer.Enabled=false;
    }
}

but as I click start button timer works fine and after every minute it gets called but as I try to stop it it does not work And the _timer_Elapsed events gets called after every 1 minute

Upvotes: 0

Views: 1531

Answers (3)

Thorsten Dittmar
Thorsten Dittmar

Reputation: 56727

You could easily make the timer fire only once by setting AutoReset = false. Then you'd have to restart the timer manually in the timer's event handler.

System.Timers.Timer _timer = new System.Timers.Timer(1000);  
bool timerStarted = false;

protected void Button1_Click(object sender, EventArgs e)
{
    _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
    _timer.Enabled = true;
    _timer.AutoReset = false;
    timerStarted = true;
}

protected void Button2_Click(object sender, EventArgs e)
{
    timerStarted = false;
    _timer.Enabled=false;
}

void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
    _timer.Enabled = timerStarted;
}

Oh, and by the way: I don't know what you're trying to achieve, but an ASP.NET page is not something that runs for a longer time. The code is executed once on the server and the HTML is passed back to the client. So what you want may not work at all.

Upvotes: 0

Ehsan
Ehsan

Reputation: 32719

Edit the code as below

public partial class TimerScheduler : System.Web.UI.Page
{
   System.Timers.Timer _timer = new System.Timers.Timer(10000);
    protected void Page_Load(object sender, EventArgs e)
    {
       _timer.Elapsed -= new ElapsedEventHandler(_timer_Elapsed); //to avoid multiple linking of event
        _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
    }
    static void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        _timer.Enabled = true;
    }
    protected void Button2_Click(object sender, EventArgs e)
    {        
        _timer.Enabled=false;
    }
}

Upvotes: 1

Sudhakar Tillapudi
Sudhakar Tillapudi

Reputation: 26209

You just Subscribe to the ElapsedEvent outside the Button1_Click event handler and start the Timer in Button1_Click event handler.

System.Timers.Timer _timer = new System.Timers.Timer(10000);
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
protected void Button1_Click(object sender, EventArgs e)
{        
    _timer.Start();
}
protected void Button2_Click(object sender, EventArgs e)
{
    _timer.Stop();
}

Upvotes: 0

Related Questions