C#实现Windows后台服务实例浅析

c#创建安装windows服务 1.1、Windows服务是什么?Windows服务是在Windows操作系统上,以后台形式运行的应用程序。它们可以在系统启动时自动启动,并且独立于用户登录。Windows服务通常用于执行那些长时间运行、无需用户交互或需要在后台持续执行的任务。1.2、Windows能用来做什么?后台任务和自动化:可以使用Windows服务来执行重复性的计划任务、数据同步、定期备份、报告生成等。网络服务:Windows服务可以作为网络服务器提供网络服务,如Web服务器、FTP服务器、邮件服务器等。 阅读详情

C#实现Windows后台服务实例之前要明白的一些概念:所谓Windows后台服务,即后台自动运行的程序,一般随操作系统启动而启动,在我的 电脑 服务后应用程序 服务里面能看到当前电脑的服务.一般而言,程序上用VC、C++写Windows服务,但是我对这些语言不是很熟,一般编程用C#较多,所以就用C#语言 写了一个Windows服务.

C#实现Windows后台服务实例其实需求是这样的,做那个报价系统的时候加入了发短信的功能,订单处理完即将发货的时候要发送短信都客户手机 上,公司内部员工处理订单超时要自动发短信,群发产品促销信息到客户手机上等,还有定时发送短信的需求,所以最后面决定把发短信的模块独立出来,以后还有 什么功能方便一起调用,而最终选择了采用Windows后台服务.

C#实现Windows后台服务实例其实Windows服务并不好做到通用,它并不能在用户的界面显示一些什么信息等,它只是在后台默默的处理一些 事情,起着辅助的作用.那如何实现发送段信通用调用的接口呢?它们之间的信息又是如何来交互呢?数据库!对,就是它存储数据信息的.而数据库都能很方便的 访问操作.把发送短信的后台服务定时去访问一个数据库,而另外任何要发送短信的地方也访问数据库,并插入一条要发送的短信到表里面,稍后Windows后 台服务访问该表将此短信发送出去.这可能是一个比较蠢的方法,但实现起来较简单.

C#实现Windows后台服务实例首先,由于它是要安装的,所以它运行的时候就需要一个安装类Installer将服务安装到计算机,新建一个后 台服务安装类继承自Installer,安装初始化的时候是以容器进行安装的,所以还要建立ServiceProcessInstaller和 ServiceInstaller服务信息组件添加到容器安装,在Installer类增加如下代码:

 
  1. private  System.ComponentModel.IContainer components =  null ;  
  2. private  System.ServiceProcess.ServiceProcessInstaller spInstaller;  
  3. private  System.ServiceProcess.ServiceInstaller sInstaller;  
  4. private   void  InitializeComponent()  
  5. {  
  6. components =  new  System.ComponentModel.Container();  
  7.  
  8. // 创建ServiceProcessInstaller对象和ServiceInstaller对象  
  9. this .spInstaller =  new  System.ServiceProcess.
  10. ServiceProcessInstaller();  
  11. this .sInstaller =  new  System.ServiceProcess.ServiceInstaller();  
  12.  
  13. // 设定ServiceProcessInstaller对象的帐号、用户名和密码等信息  
  14. this .spInstaller.Account = System.ServiceProcess.
  15. ServiceAccount.LocalSystem;  
  16. this .spInstaller.Username =  null ;  
  17. this .spInstaller.Password =  null ;  
  18.  
  19. // 设定服务名称  
  20. this .sInstaller.ServiceName =  "SendMessage" ;  
  21. sInstaller.DisplayName =  "发送短信服务" ;  
  22. sInstaller.Description =  "一个定时发送短信的服务" ;  
  23.  
  24. // 设定服务的启动方式  
  25. this .sInstaller.StartType = System.ServiceProcess.
  26. ServiceStartMode.Automatic;  
  27.  
  28. this .Installers.AddRange( new  System.Configuration.
  29. Install.Installer[] {  this .spInstaller,  this .sInstaller });  
  30. } 

C#实现Windows后台服务实例再添加一个服务类继承自ServiceBase,我们可以重写基类的OnStart、OnPause、 OnStop、OnContinue等方法来实现我们需要的功能并设置指定一些属性.由于是定事发送短信的服务,自然少不了Windows记时器,在 OnStart事件里我们写入服务日志,并初始化记时器.

 
  1. private  System.Timers.Timer time;  
  2. private   static   readonly   string  CurrentPath = 
  3. Application.StartupPath +  "//" ;  
  4. protected   override   void  OnStart( string [] args)  
  5. {  
  6. string  path = CurrentPath +  "Log//start-stop.log" ;  
  7. FileStream fs =  new  FileStream(path, FileMode.
  8. Append, FileAccess.Write);  
  9. StreamWriter sw =  new  StreamWriter(fs);  
  10. sw.WriteLine( "The Service is Starting On "  + 
  11. DateTime.Now.ToString());  
  12. sw.Flush();  
  13. sw.Close();  
  14. fs.Close();  
  15.  
  16. time =  new  System.Timers.Timer(1000 * Convert.
  17. ToInt32(GetSettings( "TimeSpan" )));  
  18. time.Enabled =  true ;  
  19. time.Elapsed +=  this .TimeOut;  
  20. time.Start();  
  21. } 

C#实现Windows后台服务实例实例化记时器类启动后,将在指定时间间隔触发Elapsed指定事件,如上GetSettings为读取我 App.config文件里一个配置节点(值为30)的方法,所以上面将会每隔30秒调用TimeOut方法.而改方法就是我们发短信的具体操作.代码如 下:

 
  1. private   void  TimeOut( object  sender, EventArgs e)  
  2. {  
  3. try  
  4. {  
  5. if  (GetSettings( "Enabled" ).ToLower() ==  "true" )  
  6. {  
  7. SqlConnection con =  new  SqlConnection(GetSettings( "ConnString" ));  
  8. SqlCommand cmd =  new  SqlCommand( "select [sysid],
  9. [admin_inner_code],[user_inner_code],[phone],
  10. [message],[sendtime] from [tbl_note_outbox]" , con);  
  11. con.Open();  
  12. SqlDataReader rdr = cmd.ExecuteReader();  
  13. while  (rdr.Read())  
  14. {  
  15. string  phone = rdr[ "phone" ].ToString();  
  16. string  message = rdr[ "message" ].ToString();  
  17. string  sendtime = rdr[ "sendtime" ].ToString();  
  18. System.Text.Encoding encoder = System.Text.Encoding.GetEncoding( "GB2312" );  
  19. string  url =  string .Format( "http://211.155.23.205/
  20. isapi.dll?SendSms&AgentID={0}&PassWord={1}&phone={2}&msg={3}&sendtime={4}" , 
  21. GetSettings( "AgentID" ), GetSettings( "PassWord" ), 
  22. phone,System.Web.HttpUtility.UrlEncode( message,encoder), sendtime);  
  23. System.Net.WebClient wClient =  new  System.Net.WebClient();  
  24. string  msg = System.Text.Encoding.Default.GetString(wClient.DownloadData(url));  
  25. wClient.Dispose();  
  26.  
  27. //删除已经发送成功的,并保存发送记录  
  28. if  (msg ==  "发送成功" )  
  29. {  
  30. DateTime dtsend = sendtime ==  "0"  ? DateTime.Now : 
  31. DateTime.ParseExact(sendtime,  "yyyyMMddHHmmss" ,  null );  
  32. string  sql =  string .Format( "delete from 
  33. [tbl_note_outbox] where [sysid]={0} INSERT INTO [tbl_note_log] 
  34. ([admin_inner_code],[user_inner_code],[status],[phone],
  35. [message],[sendtime]) VALUES('{1}','{2}','{3}','{4}','{5}','{6}')" ,
  36.  rdr[ "sysid" ], rdr[ "admin_inner_code" ], rdr[ "user_inner_code" ],
  37.  msg, phone, message, dtsend);  
  38. SqlConnection conn =  new  SqlConnection(GetSettings( "ConnString" ));  
  39. SqlCommand delete =  new  SqlCommand(sql, conn);  
  40. conn.Open();  
  41. delete.ExecuteNonQuery();  
  42. conn.Close();  
  43. delete.Dispose();  
  44. }  
  45.  
  46. }  
  47. rdr.Close();  
  48. con.Close();  
  49. cmd.Dispose();  
  50. }  
  51. }  
  52. catch  (Exception ex)  
  53. {  
  54. string  errorPath = CurrentPath +  "Log//error.log" ;  
  55. if  (!File.Exists(errorPath))  
  56. {  
  57. FileStream create = File.Create(errorPath);  
  58. create.Close();  
  59. }  
  60. FileStream fs =  new  FileStream(errorPath, 
  61. FileMode.Append, FileAccess.Write);  
  62. StreamWriter sw =  new  StreamWriter(fs);  
  63. sw.WriteLine( "Exception: "  +ex.Message+ " --" +
  64.  DateTime.Now.ToString());  
  65. sw.Flush();  
  66. sw.Close();  
  67. fs.Close();  
  68. }  
  69.  
  70. } 

C#实现Windows后台服务实例上面我们使用try、catch访问数据库,并记录错误异常信息. 发送短信是使用发送一个Web请求发送出去的,要注意请求url字符串的编码类型,要与请求页面编码一致,不然会出现乱码.上面我们请求的是智网通集团短 信(网址:http://www.09168.net/)的Web接口,通过访问他的网站来实现发短信,当然还要传递一些用户名、密码、手机号码和要发送 的短信息等参数.他的收费平均大概为7分/条的样子,其实我原本不想用发送Web请求的这样方式来发送短信的,它本身提供了调用它发送短信的DLL,而且 还有vc、delphi调用的Demo,但是没有用C#调用的例子,我刚开始试着用非托管动态链接库他提供的DLL,不知方法调用那里出错了一直都没能成 功发送出短信,所以后来就用了他的Web方式接口了.他页面直接返回发送短信的状态信息.返回发送成功则短信发送成功,成功后我再将此条信息从要发送短信 表里删除并保存在发送记录表里面,以备日后方便查询.其实登陆他的官网进入后台也能方便的查询,如下图.

保存在发送记录表里面  

C#实现Windows后台服务实例发送短信服务的代码基本上搞定了,就看怎么在服务器上安装部署了.C#写的Windows后台服务不能直接安 装,需要借助.NET Framework里面的InstallUtil.exe安装工具安装,我们可以做成一个执行CMD命令的文件BAT文件来安装启动它,命令如下:

 
  1. %windir%/Microsoft.NET/  
  2. Framework/v2.0.50727/  
  3. InstallUtil.exe %CD%/  
  4. SendMessage.exe  
  5. net start SendMessage 

安装启动  

安装完成以后,我们可以在我的电脑管理服务里面看到才安装上的后台服务.

后台服务  

经测试,采用定时访问数据库发送短信的服务并不是很耗资源,刚启动的时候只占用内存为7、8M左右,经过在服务器上连续运行几天不关闭占用的内存也 只升到15M左右,运行比较稳定

C#应用Windows服务 c#应用Windows服务背景一、创建windows服务1.创建windows服务工程项2.修改服务的实现文件service1.cs3.配置服务信息二、安装、启动、停止、卸载服务三、总结 背景 最近接到了一个有关进程通信的项目,主要实现的是客户的控制系统进程通过我们提供的接口向我们的软件发送消息执行动作,实现一个自动化的控制过程。通信模块主要是基于ZeroMQ实现的,在方案评审中大佬提出了,如果将通信模块直接加入我们的主工程会导致我们的软件和客户的进程耦合度较高。因此,需要添加一个中间层,将通信模块做成一个 阅读详情

相关推荐

C# 与 Windows 服务:创建后台守护进程

Windows 服务是一种特殊的应用程序,它可以在 Windows 系统后台运行,不需要用户的交互。这些服务可以由操作系统在启动时自动启动,也可以手动启动或停止。恭喜你!现在你应该能够创建自己的 Windows 服务了。虽然这个例子很简单,但它涵盖了创建 Windows 服务的基本步骤。你可以在此基础上扩展更多功能,比如数据库操作、网络通信等。希望这篇教程对你有所帮助,如果你有任何问题,欢迎随时提问!如果你觉得这篇教程还不够详细或者有其他疑问,记得告诉我哦!我会随时为你提供帮助的!

java专栏 1794

c#后台任务运行

方法一,可以起一个Task任务,在Task任务中写个死循环,这种死循环最好在最后写个 Thread.Sleep,不然程序会占用很高的CPU。在C#中如果想要执行一段一直运行的程序,如监听网络状态,实时读取PLC数据,遇到这种情况有多种解决方法。

qq_35624605的博客 1883

C#与Windows服务:打造你的专属后台小精灵

Windows服务是一种在Windows操作系统上运行的应用程序,它可以在后台运行,无需用户交互。它们通常用于执行系统级任务,如文件同步、数据备份、定时任务等。

java专栏 932

Spring Security http basic 示例代码

去下载

ICode联盟 1295

C#与Windows服务:创建后台运行的应用程序详解

Windows服务是一种长期运行的应用程序,它可以在操作系统启动时自动启动,并在不需要用户交互的情况下继续运行。后台运行:无需用户界面,可以在后台持续执行任务。自动启动:可以在系统启动时自动启动,确保服务的可用性。高可靠性:即使系统重启,服务也能自动恢复运行。权限控制:可以根据需要配置不同的权限级别,增强安全性。如前面示例所示,使用写入自定义日志文件。DateTimeNow} }message} }除了Windows事件日志,还可以使用自定义日志文件进行更详细的记录。

墨夶的博客 1262

C# 开发 Windows 服务实例详解

Windows服务是Windows操作系统中的一种后台进程,它不需要用户登录即可运行,并且可以执行如监控硬件状态、提供网络服务等任务。与常规应用程序不同,服务通常在用户无法看到的环境中运行,为系统和应用程序提供支持。对于IT行业来说,理解和应用Windows服务是构建稳定、可靠系统的关键。服务可以实现特定功能,如网络服务、系统监控、数据库管理等,而且不需要用户登录即可运行。开发Windows服务可以使用多种工具和语言,如C#结合.NET框架。

weixin_42405592的博客 1442

c# winform将打开的程序置于后台运行的代码

通过如下代码,我们可以将如何进程隐藏起来,让其在后台运行。   如下代码是C#语言的代码     Process pro = new Process();   string arguments="123.txt";   ProcessStartInfo proStartInfo = new ProcessStartInfo("notepad.exe", arguments);   proSta

root_x 4334

可调试的Windows服务模板:支持控制台运行的C#后台服务开发

要创建一个可用的 Windows 服务,必须定义一个继承自的类,并至少重写OnStart和OnStop方法。下面是一个典型的实现模板:// 每分钟执行一次// 必须设置 ServiceName 才能被 SCM 识别// 支持暂停/继续// 启用自动日志记录// 初始化定时器_timer?.Stop();_timer?.Dispose();_timer?.Stop();_timer?.Start();// 模拟周期性工作。

weixin_42607969的博客 822

C#中如何使用Process.Start()使一个无gui的exe应用程序在后台启动 .

C#中如何使用Process.Start()使一个无gui的exe应用程序在后台启动 比如 在cmd模式下可以使用 start/b abc.exe -argument //声明一个程序信息类 System.Diagnostics.ProcessStartInfo Info

SUNMOONSTAR专栏 8947

C#程序后台运行原理

主要用来模拟程序后台运行,内容不是不多,适合c#初学者

基于CANoe的Basic Diagnostics ECU (UDS)

基于CANoe的Basic Diagnostics ECU (UDS)

farmer00的博客 9153

windows程序在后台运行有几种开发方法

你可以使用 C#、VB.NET 或者其他 .NET 语言来编写 Windows 服务,并且可以使用 .NET Framework 提供的 System.ServiceProcess 命名空间来创建和管理服务。编译完成后,右键单击项目,在“属性”窗口中找到“输出类型”属性,选择“Windows 应用程序”->“Windows 服务”。在“新建项目”对话框中,选择“Visual C#”->“Windows 桌面”->“Windows 服务”。在 Windows 平台上,有多种方法可以开发能够在后台运行的程序。

zhangzhechun的专栏 7820

微纳加工技术中的自对准硅化物(Silicide)工艺:关键步骤与应用场景解析

本文深入解析了微纳加工技术中的自对准硅化物(Silicide)工艺,详细介绍了其关键步骤与应用场景。从表面清洁、金属沉积到两步退火法,全面拆解工艺全流程,并探讨了不同技术节点下的工艺演进。文章还提供了实际应用中的问题排查方法和新兴技术对Silicide工艺的挑战,为芯片制造领域的工程师提供了实用参考。

weixin_30613727的博客 429

基于C#实现Windows服务

在实际应用过程中,有时候我们希望开发的程序,不需要界面,直接开机就可以长时间运行,这时候,我们可以考虑做成一个Windows服务。这篇文章跟大家介绍一下,如何基于C#实现Windows服务的创建、安装、启动、停止和卸载。Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。

xiketangAndy的博客 5829

线性分类器(Linear Classifier)

线性分类器 如上图所示,这是二维空间中的一个数据集,如果他正好能够被一条直线分成两类,那么我们称它为线性可分数据集,这条直线就是一个线性分类器。 在三维空间中,如果数据集线性可分,是指能够被一个平面分为两类。 在一维空间中,所有的点都在一条直线上,如果线性可分。可以理解为它们能够被一个点分开。 这里的直线、平面、点被分为决策边界。 一个 m 维空间中的数据集,如果能够被一个超平面一分为二,那么这个数据集就是线性可分的,这个超平面就是决策边界。 例如,这是二维平面上的一条直线, 它可以把平面切分成两

xuechanba的博客 1万+

单相PWM整流器搭建训练——(一)拓扑原理介绍

单相整流器是一种将交流电转换为直流电的设备,主要由变压器、整流元件和滤波电路组成。变压器将输入的交流电压转换为适合整流的较低电压,整流元件(如二极管)利用其单向导电性将交流电转换为脉动直流电,最后滤波电路去除脉动直流电中的纹波,输出较为平滑的直流电,从而实现交流到直流的转换,广泛应用于各类电源设备中。

DikouNass的博客 1587

基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(二)——实现Windows服务内嵌WCF服务

基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(二)——实现Windows服务内嵌WCF服务

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 3455

基于PCIE8311+FPGA+TMS320F28335 PCIE应用项目开发板PROTEL99设计硬件(原理图+PCB)文件

基于PCIE8311+FPGA+TMS320F28335 PCIE X1应用项目开发板PROTEL99设计硬件(原理图+PCB)文件,Protel 99se 设计的项目工程文件,包括原理图及PCB印制板图,可用Protel或 Altium Designer(AD)软件打开或修改,都已经制板在实际项目中使用,可作为你产品设计的参考。

GJZGRB的博客 577

基于C#实现Windows后台窗口操作与图像处理技术分析

通过结合Win32 API和现代图像处理库,C#程序员能够高效地获取和操作后台窗口。本篇文章详细探讨了从窗口绑定、截图到图标搜索的完整技术流程,并提供了示例代码供开发者参考。在实践中,需根据具体应用场景,进行适当的代码优化和错误处理,以达到最适的应用效果。通过本文的学习,你应当掌握了如何在C#中利用Windows API和OpenCV库,实现在后台窗口中查找并定位特定图标。这项技术将为你的开发工作带来丰富的工具和灵活性。

百锦再的博客 1万+

【C语言笔记初级篇】第一章:C语言快速入门及注意事项

(1)第一个C语言程序 A:利用vs2010写C语言程序 1:按以下步骤新建工程 2:添加源文件,“.c”文件 B:第一个C语言代码 1:以下是基本的C语言程序 2:由于没有设置连接器,所以打印结果没有显示,按照如下步骤链接控制台 (2)数据类型 A:基本数据类型及占用字节 B:一些概念的梳理 概念一:关于计算机的单位 位(bit):计算机通过电路的开关和闭合处理信息,电路通...

快乐江湖的博客 3737

29、高速低功耗采样保持放大器设计

本文详细介绍了适用于低功耗模数转换器的高速低电压采样保持放大器(SHA)的设计技术,包括传统SHA的局限性、采样技术分类以及全NPN型和BiCMOS型SHA的具体设计实现。同时,文章深入探讨了优化输入电容、采样开关驱动及低功耗设计等具体措施,并提供了10位ADC前端和无线通信应用中的实例分析,为相关领域的工程师提供有价值的参考。

weixin_30600615的博客 424

深入解析基于C#的Windows服务、WCF服务、WebService服务和WebApi服务

深入解析基于C#的Windows服务、WCF服务、WebService服务和WebApi服务

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 5296

LPDDR6与LPDDR5 ZQ Calibration技术探讨

LPDDR6与LPDDR5 ZQ Calibration技术探讨

zilan23的博客 1099

C# Windows 服务程序的开发

安装程序将服务的可执行文件注册到系统服务管理器中,并提供安装、卸载和配置服务的功能。在这个类中,需要重写 OnStart 和 OnStop 方法,分别用于处理服务的启动和停止逻辑。通过使用 .NET 提供的相关类和方法,可以轻松地创建、安装、启动和停止 Windows 服务。Windows 服务是一种特殊类型的应用程序,它可以在操作系统启动时自动启动,并在后台持续运行,而无需用户交互。这里重写了一个 OnStart 和 OnStop 方法,意思是程序启动的时候执行一次,和程序关闭的时候执行一次。

熊思雨的博客 5140

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C# WINDOWS服务交互的实现

chin_yong的专栏 2260

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: Javascript控制文本框只能输入数字
下一篇: gffhg
hh_longke
博客等级 码龄18年 5粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值