C# Windows 瑟维斯中推行死循环轮询

用C#编写制定Windows
Service时,执行轮询1般有三种办法,1种是用Timer,System.Timers或许是System.Thread下的,那种实践是按时间循环执行,缺点是唯恐上个执行还未能如愿,又起先履行新的。

另一种艺术是应用线程,在OnStart里单开3个线程去跑含有死循环结构的函数,这种方法的瑕疵是,对线程的决定困难,结束服务了,线程还有非常的大概率在履行,但是.Net 四.0+
给大家提供了 CancellationTokenSource,用来撤消正在周转的线程(Task),代码:

CancellationTokenSource cancelTokenSource = new CancellationTokenSource();

        protected override void OnStart(string[] args)
        {
            Logger.Instance.WriteLine("{0} is start.", base.ServiceName);
            Task.Factory.StartNew(DoWork, cancelTokenSource.Token);
        }

        protected override void OnStop()
        {
            cancelTokenSource.Cancel();
            cancelTokenSource.Dispose();
            Logger.Instance.WriteLine("{0} is stop.", base.ServiceName);
        }

        private void DoWork(object arg)
        {
            while (!cancelTokenSource.IsCancellationRequested)  // Worker thread loop
            {
                Logger.Instance.WriteLine("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now);
                System.Threading.Thread.Sleep(2000);
            }
        }

 

相关文章