Best way to do a task looping in Windows Service

前端 未结 2 1419
清歌不尽
清歌不尽 2020-12-08 08:26

I have a method that send some SMS to our customers that look like below:

public void ProccessSmsQueue()
{
   SmsDbContext context = new SmsDbContext();
   I         


        
2条回答
  •  一个人的身影
    2020-12-08 08:47

    Sample Worker Class that I have used in Windows Services. It supports stopping in a 'clean' way by using a lock. You just have to add your code in DoWork, set your timer in the StartTimerAndWork method (in milliseconds), and use this class in your service.

    public class TempWorker
        {
            private System.Timers.Timer _timer = new System.Timers.Timer();
            private Thread _thread = null;
    
            private object _workerStopRequestedLock = new object();
            private bool _workerStopRequested = false;
    
            private object _loopInProgressLock = new object();
            private bool _loopInProgress = false;
    
            bool LoopInProgress
            {
                get
                {
                    bool rez = true;
    
                    lock (_loopInProgressLock)
                        rez = _loopInProgress;
    
                    return rez;
                }
                set
                {
                    lock (_loopInProgressLock)
                        _loopInProgress = value;
                }
            }
    
            #region constructors
            public TempWorker()
            {
            }
            #endregion
    
            #region public methods
            public void StartWorker()
            {
                lock (_workerStopRequestedLock)
                {
                    this._workerStopRequested = false;
                }
                _thread = new Thread(new ThreadStart(StartTimerAndWork));
                _thread.Start();
            }
            public void StopWorker()
            {
                if (this._thread == null)
                    return;
    
                lock (_workerStopRequestedLock)
                    this._workerStopRequested = true;
    
                int iter = 0;
                while (LoopInProgress)
                {
                    Thread.Sleep(100);
    
                    iter++;
    
                    if (iter == 60)
                    {
                        _thread.Abort();
                    }
                }
    
                //if (!_thread.Join(60000))
                //    _thread.Abort();
    
            }
            #endregion
    
    
            #region private methods
    
            private void StartTimerAndWork()
            {
                this._timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                this._timer.Interval = 10000;//milliseconds
                this._timer.Enabled = true;
                this._timer.Start();
    
            }
    
    
            #endregion
    
    
            #region event handlers
            private void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                if (!LoopInProgress)
                {
                    lock (_workerStopRequestedLock)
                    {
                        if (this._workerStopRequested)
                        {
                            this._timer.Stop();
                            return;
                        }
                    }
    
                    DoWork();
    
                }
            }
    
            private void DoWork()
            {
                try
                {
                    this.LoopInProgress = true;
    
                    //DO WORK HERE
    
                }
                catch (Exception ex)
                {
                    //LOG EXCEPTION HERE
                }
                finally
                {
                    this.LoopInProgress = false;
                }
            }
            #endregion
    
        }
    

提交回复
热议问题