?? 用.net創建windows service的總結.txt
字號:
用.net創建windows service的總結
--------------------------------------------------------------------------------
tojike 時間:2003-7-31 11:16:15
前言
net為創建windows service提供了專門的類庫,結束了以前開發windows service窘迫的局面。你甚至可以不用添加一行代碼,就可以用wizard生成一個windows service。
一、用wizard生成最基本的框架
此時,系統會為你生成一個框架,部分主要源代碼如下:
using System;<o:p>
using System.Collections;<o:p>
using System.ComponentModel;<o:p>
using System.Data;<o:p>
using System.Diagnostics;<o:p>
using System.ServiceProcess;<o:p>
namespace WindowsService1<o:p>
{<o:p>
public class Service1 : System.ServiceProcess.ServiceBase<o:p>
{<o:p>
<o:p>
private System.ComponentModel.Container components = null;<o:p>
<o:p>
public Service1()<o:p>
{<o:p>
InitializeComponent();<o:p>
}<o:p>
static void Main()<o:p>
{<o:p>
System.ServiceProcess.ServiceBase[] ServicesToRun;<o:p>
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new Service1() };<o:p>
System.ServiceProcess.ServiceBase.Run(ServicesToRun);<o:p>
}<o:p>
private void InitializeComponent()<o:p>
{<o:p>
components = new System.ComponentModel.Container();<o:p>
this.ServiceName = "Service1";<o:p>
}<o:p>
protected override void Dispose( bool disposing )<o:p>
{<o:p>
if( disposing )<o:p>
{<o:p>
if (components != null) <o:p>
{<o:p>
components.Dispose();<o:p>
}<o:p>
}<o:p>
base.Dispose( disposing );<o:p>
}<o:p>
protected override void OnStart(string[] args)<o:p>
{<o:p>
<o:p>
}<o:p>
protected override void OnStop()<o:p>
{<o:p>
<o:p>
}<o:p>
}<o:p>
}<o:p>
<o:p>
有必要將其結構講解一下。其中,System.ServiceProcess就是關鍵所在,是引入windows service的地方。其中的OnStart()、OnStop()兩個函數能夠被windows服務管理器或者MMC調用,進行服務的啟動、停止。
二、構建一個服務
該框架提供了一個空的服務,什么也不能做。所以我們要給它添加代碼。比如,我想
做一個能夠掃描數據庫的服務,要求每次掃描完之后間隔一秒鐘,然后繼續掃描。
根據上面的要求,初步設想需要一個timer類,查命名空間,發現有二個不同的timer類,他們是:
1、 System.Windows.Forms.Timer
2、 System.Timers.Timer
還有一個System.Threading,帶有sleep方法
究竟該用哪個呢?
細查MSDN,會找到只有2適合,對于1來說,timer控制時間不夠精確,對于線程來說,實現比較困難。
三、規劃一下流程
基于該服務的要求,確定服務的流程如下:
為此,我們定義兩個函數:_Scan(bool _judge)、_DO_Something()
然后引入System.Timers命名空間,并且定義一個_timer對象,這些代碼如下:
1、using System.Timers; //引入System.Timers <o:p>
2、public System.Timers.Timer _timer; //定義對象_timer <o:p>
3、public bool _Scan(bool _judge) <o:p>
{ <o:p>
//TODO <o:p>
} <o:p>
4、public void _DO_Something() <o:p>
{ <o:p>
//TODO <o:p>
} <o:p>
<o:p>
然后在InitializeComponent()里邊把_timer的Elapsed事件添加上,代碼如下:
this._timer.Elapsed += new System.Timers.ElapsedEventHandler(this._timer_Elapsed);<o:p>
定義_timer_Elapsed事件,代碼如下:<o:p>
private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) <o:p>
{ <o:p>
_timer.Interval=1000; <o:p>
_timer.Enabled=false; <o:p>
if(_Scan()==true) <o:p>
{ <o:p>
_DO_Something(); <o:p>
} <o:p>
_timer.Enabled=true; <o:p>
} <o:p>
最后,我們不要忘記添加windows service的installer,也是一個wizard,基本上不需要添加一行代碼。然后編譯,生成一個可執行文件。注意:因為這不是普通的可執行文件,所以不能通過雙擊實現運行,只能通過installutil YourServiceName、NET START YourServiceName、NET STOP YourServiceName、installutil/u YourServiceName來進行該服務的安裝、啟動、停止、暫停(可選)、卸載。最好是做成批處理文件,一勞永逸。^_^
tojike
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -