什么是Service, 以及Service 模板

2023-10-29

Service本质就是一个驻留Process,驻留Prcess至少有一个驻留线程,这个线程处在waiting的状态(相对于Runable),控制流停在某个点上,等待外部事件驱动,或者是自己的timer驱动。

Windows Service

是一个exe,要有Main方法,Main方法要把一个继承了ServiceBase、实现了OnStart(), OnStop()等生命周期回调方法的Service类的实例注册给SCM。

void Main() {
	DataGeneratorService service = new DataGeneratorService(args);
	System.ServiceProcess.ServiceBase.Run(service);
}
当在Control Panel里启动一个Service, SCM其实就是运行程序调用Main方法,进而SCM会调用OnStart()方法。

安装Service就是把exe注册给控制面板,然后可以通过控制面板启动停止程序。Windows Service就是提供了一个帮助你管理驻留程序的界面。也可以不用,自己启动程序,自己发送消息结束process。

所有驻留Process都是一个模板: 一个循环,退出条件就是是否退出的一个flag, 然后要么阻塞在一个消息队列上,等待输入;要么就是一个timer,等待一段时间执行一次循环体。

OnStart的工作就是创建你的service Process的 驻留线程,在Mediaroom的Service里,有2个驻留线程,一个是heartbeat thread, 一个是workerMethod thread,

 protected override void OnStart(String[] args)
        {
            tracer.Write(TracerLevel.Default, "{0} is starting", this.ServiceName);

            // First, reset the event
            serviceStoppedEvent = new ManualResetEvent(false);

            // Kick off the pinging thread if it is active
            pingingThread = new Thread(new ParameterizedThreadStart(PingingThreadMethod));
            pingingThread.Name = "Pinging Thread";
            pingingThread.Start(this);

            // Kick off the worker thread.
            workerThread = new Thread(new ParameterizedThreadStart(WorkerThreadMethod));
            workerThread.Name = "Worker Thread";
            workerThread.Start(this);
        }

2个典型的驻留线程的模板

void WorkerThreadMethod () {
	do {
		//non-blocking logic 
		...
	//if stopEvent set, exit, or wait intervalTime before next run
	} while (stopEvent.WaitOne(intervalTime) == false) 
}

void workerThreadMethod() {
	do {
		input = readInput(); // blocking call
		...
	} while (stopEvent.WaitOne(0) == false) 
}


第一个是timer类型的驻留线程,第二个是等待IO型的驻留线程。

每个线程(控制流)就像一列火车,要么运行,要么停止,决定它停止或运行的是信号,也就是说一个线程必然依赖一些信号,所谓的blocking call底层就是wait到一个信号,当IO准备好数据,信号变为”可通行“,线程才接着运行。至于临界区是指那些线程之间的交叉点,十字路口,必须确保火车不相撞。

Service,即驻留process就是,等在信号上的线程。对象之间的交互是直接调用服务、相互发消息,线程之间交互式是通过信号,一个对象可以接受很多消息,但一个线程一般不会有很多依赖的信号,一般就一个,所以考虑线程的时候一定要考虑线程依赖的信号。

调用一个线程的服务,放置输入数据 + 发送信号, 



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是Service, 以及Service 模板 的相关文章

  • React 中 keys 的作用是什么?

    React 中 keys 的作用是什么 Keys 是 React 用于追踪哪些列表中元素被修改 被添加或者被移除的辅助标识 在开发过程中 我们需要保证某个元素的 key 在其同级元素中具有唯一性 在React Diff 算法中 React
  • git-推送分支

    origin为远程仓库名 命令 git push origin local branch remote branch 备注 此命令中 local branch必须为你本地存在的分支 remote branch为远程分支 如果remote b
  • 为什么要反复讲EasyAVFilter这个东西,真能替代ffmpeg吗?

    最近我写了不少关于EasyAVfilter的东西 有rtsp转mp4 MP4转HLS rtsp转rtmp 就简简单单几行代码 就能解决很多技术上的问题 而且就算是音视频开发的小白 也可以用EasyAVfilter开发出一个音视频后端出来 他

随机推荐

  • lambda表达式(详)

    函数式编程思想概括 在数学中 函数就是有输入量 输出量的一套计算方案 也就是 拿数据做操作 面向对象思想强调 必须通过对象的形式来做事情 函数式思想则尽量忽略面向对象的复杂语法 强调做什么 而不是以什么形式去做 而我们要学习的L ambda
  • 人脸检测——UnitBox

    本次介绍一篇来自旷视科技的人脸检测文章 2016 ACM MM UnitBox An Advanced Object Detection Network 代码应该是不会放出来了 但好在实现比较简单 插播一句 论文里面说速度可以达到12fps
  • c语言include使用

    gcc编译过程中查看详细信息会看到以下信息 第一个目录是使用 I加入的 也就是include lt gt 也会优先搜索指定目录 如果此时你的文件和系统文件重名就会导致真正的系统文件不能完成加载 include search starts h
  • cmake 优化

    export CXX FLAGS O3 cmake DCMAKE BUILD TYPE Release
  • android log丢失(一)使用logd丢失log原理

    之前我们分析过关于Android log机制 在这里我们再详细说下 log丢失的原理 一 统计log logd监听了logdw的socket来保存从log打印函数通过logdw socket传过来的log 最后会调用LogBuffer lo
  • C# 正则表达式30分钟入门教程到放弃

    最近用到了C 的Regex类 所以又复习了一遍C 的正则表达式 发现还是和其他语言或者说以前的学习有很多不同以及提高之处 所以写这篇文章 用来给后来人一个系统性的教程或者引导 目录 一 正则表达式到底是什么东西 二 正则入门 三 元字符 四
  • Hooks的常用Api

    Ref Hook Ref Hook可以在函数组件中存储 查找组件内的标签或其他数据 语法 const refContainer useRef 获取值 refContainer current value 作用 保存标签对象 功能与React
  • 必学的web前端三大核心:JavaScript css3 HTML5

    对于前端的学习和提高 我的基本思路是这样的 首先 前端的三个最基本的东西 HTML5 CSS3 和 JavaScript ES6 是必须要学好的 这其中有很多很多的技术 比如 CSS3 引申出来的 Canvas 位图 SVG 矢量图 和 W
  • [Ctf show web]萌新计划9

    system exec highlight 等于or 题目要求我们利用 system exec highlight才能执行eval preg match a b 函数可以返回 a匹配次数 它的值将是 0 次 不匹配 或 1 次 因为 pre
  • ※机器学习函数调用/绘图/读取文件/分析常用代码总结

    机器学习函数调用代码 决策树 from sklearn tree import DecisionTreeRegressor 随机森林 from sklearn ensemble import RandomForestClassifier 线
  • [数据可视化]使用matplotlib对CSV文件数据进行绘图

    数据可视化 使用matplotlib对CSV文件数据进行绘图 使用CSV格式的锡特卡天气数据 绘制2018年1月1日的天气数据 先放成果 代码部分包括以下内容 分析CSV文件头 打印文件头及其位置 提取并读取数据 绘制温度图表 模块date
  • redis 配置文件详解

    Redis 配置文件 当配置中需要配置内存大小时 可以使用 1k 5GB 4M 等类似的格式 其转换方式如下 不区分大小写 1k gt 1000 bytes 1kb gt 1024 bytes 1m gt 1000000 bytes 1mb
  • Qt篇——QTcpSocket设置连接超时时间

    QTcpSocket默认是没有函数接口设置超时时间的 使用以下方法可以给socket设置超时时间 QNetworkConfigurationManager manager QNetworkConfiguration config manag
  • 机器学习单变量线性回归

    1 模型概述 给出一些带有标签的数据 即带有 正确答案 的数据 用y ax b 的形式去拟合数据 线性 单变量 大致过程如下 给出训练集 带有标签的数据 通过学习算法选择不错的参数 theta0 theta1 得到假设函数h 从x到y 的映
  • 数据库之分库分表-垂直?水平?

    一 数据库瓶颈 不管是IO瓶颈 还是CPU瓶颈 最终都会导致数据库的活跃连接数增加 进而逼近甚至达到数据库可承载活跃连接数的阈值 在业务Service来看就是 可用数据库连接少甚至无连接可用 接下来就可以想象了吧 并发量 吞吐量 崩溃 1
  • 小智ai:ChatGPT3主要功能这些功能可以说明什么问题?

    ChatGPT3在自然语言处理领域中的强大能力 尤其是在文本生成和语言模型训练方面 它可以模拟人类的语言能力 理解人类的意图并生成自然的回复和文本 ChatGPT3的语言翻译和语音转文本功能也使得跨语言交流和语音交互变得更加容易 它可以自动
  • QQ取色器功能

    一 使用方法 QQ截图功能具有取色器功能 二 截取颜色三原色 1 截图 Ctral ALT A 2 找到取色目标 3 按 C 键 4 CTRL V 5 得到颜色三原色 255 255 255 三 截取十六进制颜色 1 截图 Ctral AL
  • 第三方yum源仓库搭建

    作用 第三方软件是yum仓库里没有的软件 如果从网上下载得到了软件 用yum还是不能安装 因为会有依赖性 解决依赖性非常麻烦 但是如果搭建了第三方软件仓库 yum就会自己解决这个问题 下载 浏览器搜索 sourceforge 源码安装包 r
  • 爬虫 第五讲 多线程爬虫

    文章目录 爬虫 第五讲 多线程爬虫 一 多线程 1 多线程基本介绍 2 主线程和子线程的执行关系 3 查看线程数量 4 验证子线程的执行与创建 5 继承Thread类创建线程 6 线程间的通信 多线程共享全局变量 7 线程间的资源竞争 二
  • 什么是Service, 以及Service 模板

    Service本质就是一个驻留Process 驻留Prcess至少有一个驻留线程 这个线程处在waiting的状态 相对于Runable 控制流停在某个点上 等待外部事件驱动 或者是自己的timer驱动 Windows Service 是一