用C#編寫Windows Service時,執行輪詢一般有兩種方式,一種是用Timer,System.Timers或者是System.Thread下的,這種執行是按時間循環執行,缺點是也許上個執行還沒有完成,又開始執行新的。
另一種方式是利用線程,在OnStart里單開一個線程去跑含有死循環結構的函數,這種方式的缺點是,對線程的控制困難,停止服務了,線程還有可能在執行,不過 .Net 4.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); } }