博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Windows服务中执行死循环
阅读量:4504 次
发布时间:2019-06-08

本文共 1101 字,大约阅读时间需要 3 分钟。

用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);                Thread.Sleep(2000);            }        }

 

转载于:https://www.cnblogs.com/HansZimmer/p/11262079.html

你可能感兴趣的文章
Java架构师书单
查看>>
二阶段冲刺第一天
查看>>
ArrayList删除特定元素的方法
查看>>
android 开发 View _15 导入一张图片将它裁剪成圆形 与 paint图层叠加处理详解
查看>>
地图大集合
查看>>
unity资源(移动版)提取 一点尝试
查看>>
简谈游戏场景灯光配置方案
查看>>
性能测试知识
查看>>
mybaitis配置信息
查看>>
使用shiro安全框架上传文件时用HttpSession获取ServletContext为null问题解决方法。
查看>>
数据可视化视频制作
查看>>
mysql 数据备份。pymysql模块
查看>>
FactoryMethod模式——设计模式学习
查看>>
Android中 AsyncTask
查看>>
原码、反码、补码和移码
查看>>
SQL存储过程与函数的区别
查看>>
vue项目配置使用flow类型检查
查看>>
@Resource和@Autowired区别
查看>>
VS2010打开就自动关闭问题解决
查看>>
python webdriver 测试框架-数据驱动txt文件驱动,带报告的例子
查看>>