RBS
RBS

Reputation: 19

How to pass a parameter to a timer event

I am trying to implement a timer as per the below code. I want to pass a parameter to the timer event. I have used below anonymous function approach.

However this would only pass only the first parameter to the OnTimerElapsedEvent. Can someone please advise?

    class Program
{
    static void Main(string[] args)
    {
        ClassA obj = new ClassA();
        Console.WriteLine("Start" + " " + System.DateTime.Now);
        obj.SampleMethod("hello", 3000);
        Thread.Sleep(4000);
        obj.SampleMethod("world", 6000);
        Console.ReadKey();
    }
}

class ClassA
{
    private System.Timers.Timer tTimer;

    public void SampleMethod(string strParam, int iTimerInterval)
    {
        if (tTimer == null)
        {
            tTimer = new System.Timers.Timer();
            tTimer.Elapsed += (sender, e) =>
                OnTimerElapsedEvent(sender, e, strParam);
        }

        tTimer.Interval = iTimerInterval;
        tTimer.Enabled = true;
        tTimer.Start();
    }

    private void OnTimerElapsedEvent(object source, ElapsedEventArgs e, string strParam)
    {
        //use strParam value here
        Console.WriteLine(strParam + " " + System.DateTime.Now);
        if (strParam == "world")
        {
            tTimer.Stop();
            tTimer.Enabled = false;
        }
    }
}

Upvotes: 0

Views: 1446

Answers (1)

Andrew
Andrew

Reputation: 701

You can inherit the Timer class to provide a parameter in the constructor like below. Or you can inherit the Timer class and provide a property:

 [TestClass]
public class TimerTester
{
    [TestMethod]
    public void TestYourTimer()
    {
        var timer1 = new TimerWithParameter("param1");
        timer1.Interval = 1000;
        timer1.ElapsedEvent += Timer_ElapsedEvent;
        timer1.Start();

        var timer2 = new TimerWithParameter("param2");
        timer2.Interval = 1300;
        timer2.ElapsedEvent += Timer_ElapsedEvent;
        timer2.Start();

        Thread.Sleep(5000);
    }

    private void Timer_ElapsedEvent(object source, ElapsedEventArgs e, string strParam)
    {
        Debug.WriteLine(strParam);
    }
}

public delegate void ElapsedWithParameterDelegate(object source, ElapsedEventArgs e, string strParam);

public class TimerWithParameter:Timer
{
    private readonly string _strParam;
    public event ElapsedWithParameterDelegate ElapsedEvent;

    public TimerWithParameter(string strParam)
    {
        _strParam = strParam;
        this.Elapsed += TimerWithParameter_Elapsed;
    }

    private void TimerWithParameter_Elapsed(object sender, ElapsedEventArgs e)
    {
        ElapsedEvent?.Invoke(this, e, _strParam);
    }
}

Upvotes: 1

Related Questions