C#创建控制台项目引用Topshelf的方式,部署windows服务。
上一篇是直接创建windows service服务来处理需求。调试可能会麻烦一点。把里面的逻辑写好了。然后受大神指点,用Topshelf会更好一些。
来公司面试的时候问我,为什么要用stringbuilder,领导说,我平时用string拼字符串也挺好的呀。
我那时候潜意识就是觉得学会加减法都是为了乘除法做准备的。实际上应该是stringbuilder效率会高一些吧。
引用Topshelf的优势就是方便调试吧。因为你运行起来就是控制台界面。
而且命名直接在.cs中就可以了。不需要在windows service的属性中对应改一些配置吧。个人心得。
【开始简单介绍一下使用方法】
1.新建一个控制台项目,只需要引用Topshelf.dll即可,为了日志输出显示,建议也引用Topshelf.Log4net.
Visual Studio 点工具——>NuGet包管理器——>点程序包管理控制台
程序安装命令:
Install-Package Topshelf
Install-Package Topshelf.Log4Net
2.Program中Main()方法
/// <summary>
/// 应用程序的主入口点。
/// </summary>
private static void Main()
{
HostFactory.Run(conf =>
{
conf.Service<AutoCancelService>(service =>
{
service.ConstructUsing(name => new AutoCancelService());
service.WhenStarted(tc => tc.OnStart());
service.WhenStopped(tc => tc.OnStop());
}); conf.RunAsLocalSystem(); conf.SetDescription("自动取消XXX"); //服务的描述
conf.SetDisplayName("Auto dosomesthing Service");
conf.SetServiceName("Auto dosomesthing Service");
conf.StartAutomatically(); // Start the service automatically 自动模式 });
}
然后对应建立AutoCancelService类,来写逻辑代码。注意类中一定要对应有OnStart()和 OnStop()方法,不然会报错:Lamdba表达式没有返回值之类的。
public class AutoCancelService
{ public void OnStart()
{
this.WriteLog("自动取消服务:【服务开启】");
//在这里写逻辑代码
} public void OnStop()
{
this.WriteLog("自动取消服务:【服务关闭】");
}
}
运行起来的界面是这样的

【关于部署】
用管理员权限打开Cmd,定位到程序所在目录:
安装:
ProductDownloadService.exe install
卸载:
ProductDownloadService.exe uninstall
【例如】
1.C盘下新建WindowService文件夹,将最新生辰的Debug内容拷贝到该文件夹。
2.管理员运行CMD
3.命令在C:\盘符下执行
【回退上级文件夹】
CD..
【安装命令】
WindowService\ProductDownloadService.exe install
【卸载命令】
WindowService\ProductDownloadService.exe uninstall
目前我自动执行用timer,还可以用cron表达式,更灵活。等我学会再写一篇详细介绍。
如果看完对你有帮助可以留言,告诉我一下。我写了这么久博客,初衷只是为了帮自己记录知识。常来博客园感受氛围,受熏陶。
从前我手机浏览器主页是新闻,现在我换成博客园主页了,公交车上随手打开可能就看到哪个知识点会被吸引,肯定是要比阅读一些垃圾新闻更有用。
我只是要求自己保证每个月记录一篇有趣的内容就好了,最近感觉学到了很多知识,如果可以的话,我多整理一些文档。
路过的大神朋友希望多鼓励,多指点,路过的新手朋友希望对你有帮助。
C#创建控制台项目引用Topshelf的方式,部署windows服务。的更多相关文章
- Topshelf+Quartz3.0基于控制台应用程序快速开发可调度windows服务
1.TopShelf TopShelf是一个开源的跨平台的宿主服务框架.可通过.Net Core/.Net Framwork控制台应用程序快速开发windows服务,更加便于服务调试. 本文基于.Ne ...
- Python环境搭建、python项目以docker镜像方式部署到Linux
Python环境搭建.python项目以docker镜像方式部署到Linux 本文的项目是用Python写的,记录了生成docker镜像,然后整个项目在Linux跑起来的过程: 原文链接:https: ...
- netcore项目在Windows部署:使用NSSM部署Windows服务
NSSM部署Windows服务 1 准备工作 在Windows平台部署Asp.net core应用程序一般采用IIS,但是如果我们的net core应用执行的是定时任务,需要开机自启,稳定运行的话,使 ...
- topshelf包装redis为windows服务
topshelf包装redis为windows服务 Redis服务端目前用的是控制台程序运行,部署的时候能作为windows服务后台运行感觉更好.找到一篇文章Running Redis as a Wi ...
- .Net Core 项目引用本地类库方式(一)
最近了解到.NET Core 项目,引用本地类库DLL的方式有三种 1.非同解决方案下的引用,直接引用,浏览,找到对应的DLL,然后确定引用. 这种方式有个不好的地方就是,如果引用的DLL文件里面,也 ...
- Intellij IDEA 创建控制台项目,断点调试
在idea 2016中创建一个控制台项目(经常会忘) 打开创建界面 注意,什么都不要选,点击next(最坑的地方,经常忘) 再次点击next ============================= ...
- 用Eclipse+ADT创建可运行项目,创建lib项目,引用一个lib项目
Managing Projects from Eclipse with ADT In this document Creating an Android Project 创建可运行项目 Settin ...
- Intellij IDEA 创建控制台项目,断点调试快捷方式
在idea 2016中创建一个控制台项目(经常会忘) 打开创建界面 注意,什么都不要选,点击next(最坑的地方,经常忘) 再次点击next ============================= ...
- .Net Core 项目引用本地类库方式(二)
上篇文章有详细的介绍.Net Core 项目中引用本地类库通过打包,然后Nugety引用方式,这里再介绍一种引用包的方式
随机推荐
- css3动画和animate.css动画库使用
CSS3动画 css3动画可以分为两种.transition过渡动画和keyframes关键帧动画 过渡动画 第一种叫过渡(transition)动画,就是从初始状态过渡到结束状态这个过程中所产生的动 ...
- WiFi攻击中“核武器”
3·15晚会上,央视曝光了WiFi探针盒子通过手机MAC地址.大数据匹配获取手机用户个人信息的典型案例. 其中,曝光的“声牙科技有限公司”号称有全国6亿手机用户的个人信息,包括手机号,只要将获取到的手 ...
- FLOAT 和 DOUBLE区别
以下是 FLOAT 和 DOUBLE 的区别: float : 单精度浮点数 double : 双精度浮点数 ·浮点数以 8 位精度存储在 FLOAT 中,并且有四个字节. ·浮点数存储在 DOUBL ...
- Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用(转)
原文地址:https://www.cnblogs.com/fashflying/p/6908028.html 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对 ...
- MySQL--7种join连接
一,定义: 1)LEFT JOIN / LEFT OUTER JOIN:左外连接 左向外连接的结果集包括:LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行.如果左表的某行在右表 ...
- pytorch错误:Missing key(s) in state_dict、Unexpected key(s) in state_dict解决
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在模型训练时加上: model = nn.DataParallel(model)cudnn.bench ...
- vue 修改数据界面没有及时更新nextTick
使用场景:有些时候,我们使用vue修改了一些数据,但是页面上的DOM还没有更新,这个时候我们就需要使用到nextTick. vm.$nextTick( [callback] ) 说明: 将回调延迟到下 ...
- path node
process.cwd() 当前Node.js进程执行时的工作目录 __dirname 当前模块的目录名 const path = require('path'); console.log(__dir ...
- LVS实现负载均衡原理
负载均衡集群是load balance 集群的简写.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备有F5.NetsNetscale.这里主要是学习lvs. === ...
- LeetCode_p150_逆波兰表达式计算/后缀表达式计算
有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...