Fire timer_elapsed immediately from OnStart in windows service

前端 未结 4 1403
情话喂你
情话喂你 2021-02-13 20:33

I\'m using a System.Timers.Timer and I\'ve got code like the following in my OnStart method in a c# windows service.

timer = new Timer(         


        
相关标签:
4条回答
  • 2021-02-13 21:13

    Use System.Threading.Timer class instead of System.Timers.Timer as this type is just a wrapper for Threading Timer.

    It also suits your requirement.

     System.Threading.Timer timer =
                    new System.Threading.Timer(this.DoWork, this, 0, 36000);
    

    Here are the details.

    0 讨论(0)
  • 2021-02-13 21:23

    Just start a threadpool thread to call the worker function, just like Timer does. Like this:

            timer.Elapsed += timer_Elapsed;
            ThreadPool.QueueUserWorkItem((_) => DoWork());
        ...
    
        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
            DoWork();
        }
    
        void DoWork() {
            // etc...
        }
    
    0 讨论(0)
  • 2021-02-13 21:29

    Use AutoReset Property of System.Timers.Timer and set it value to "true". No need to use timer.Start() because it does the same job as timer.Enabled = true;

    timer = new Timer();
    timer.Elapsed += timer_Elapsed;
    timer.Enabled = true;
    timer.Interval = 3600000;
    timer.AutoReset = true;
    

    AutoReset = true will set a value indicating that the Timer should raise the Elapsed event each time when the specified interval elapses.

    0 讨论(0)
  • 2021-02-13 21:30

    If you want your Timer to be fired immediately then you could simply just initialize the Timer object without a specified interval (it will default to 100ms which is almost immediately :P), then set the interval within the called function to whatever you like. Here is an example of what I use in my Windows Service:

    private static Timer _timer;
    
    protected override void OnStart(string[] args)
    {
        _timer = new Timer(); //This will set the default interval
        _timer.AutoReset = false;
        _timer.Elapsed = OnTimer;
        _timer.Start();
    }
    
    private void OnTimer(object sender, ElapsedEventArgs args)
    {
        //Do some work here
        _timer.Stop();
        _timer.Interval = 3600000; //Set your new interval here
        _timer.Start();
    }
    
    0 讨论(0)
提交回复
热议问题