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引用方式,这里再介绍一种引用包的方式
随机推荐
- JavaScript判断对象是否是NULL
这个方法是我踩了很多坑之后找到的,对数组等类型的对象都很好使,果断收藏! function isEmpty(obj) { // 检验 undefined 和 null if (!obj &&a ...
- mybatis动态数据更新 + 批量动态数据插入
动态更新 <update id="updateElevator" parameterType="com.diantijiang.saas.data.elevator ...
- [Alpha阶段]第八次Scrum Meeting
Scrum Meeting博客目录 [Alpha阶段]第八次Scrum Meeting 基本信息 名称 时间 地点 时长 第八次Scrum Meeting 19/04/12 新主楼F座2楼 35min ...
- Linux系统安装jdk教程
本文仅仅适用于刚刚接触Linux系统的童鞋,毕竟本人也才刚刚玩这个东西,在此记录下以便于以后能查阅及其他童鞋能进行参考,本文为原创随笔,如需转发,请标明出处,谢谢: 此处我采用的是用VMware搭建的 ...
- Hive基础知识
一.产生背景 1.MapReudce编程繁琐,需要编写大量的代码 2.HDFS中存放的都是文件,在HDFS中没有Scheme的概念,无法用SQL进行快速的查询. 二.Hive的概念 Hive是基于Ha ...
- 基于Python玩转人工智能最火框架 TensorFlow应用实践
慕K网-299元-基于Python玩转人工智能最火框架 TensorFlow应用实践 需要联系我,QQ:1844912514
- Excel vba中访问ASP.NET MVC项目,记录访问时间,文件名称
每30秒连接一次服务器,连接成功单元格变绿色,连接失败变红色,状态单元格为17行,2列 1,打开excel文件,进入vba编辑器,新建一个modules模块,在里面先写一个每30秒执行一次ConnSe ...
- Java PDF转图片
maven依赖: <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbo ...
- yk-随记
$config = Loader::loadConfig('smarty');
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...