一、 遇到什麼問題?
有些軟體,需要每隔一定時間做一些相同的事情,或者作為網路服務,像IIS、SQL Server等這樣的軟體。此種情況下,往往需要讓軟體在沒有使用者幹預的情況下在伺服器上運行。與此種程式互動往往需要通過網路通訊協定進行。或者程式根本就不需要與使用者互動。這種程式往往稱為背景程式,或後台服務。
二、 Windows服務能做些什嗎?
Windows服務是這些背景程式、後台服務的正規名詞。Windows服務的運行可以在沒有使用者幹預的情況下,在後台運行,沒有任何介面。通過Windows服務管理員進行管理。服務管理員也只能做些簡單的操作:開始,暫停,繼續,停止。
Windows服務和普通的Windows表單應用程式類型,只是沒有了介面,連最簡單的MessageBox也不能彈出來。所以不要試圖在Windows服務裡通過這種方式來提示使用者。因為可能根本沒有使用者登入電腦。
Windows服務的特點:
在後台運行
沒有使用者互動
可以隨Windows啟動而啟動
三、 如何?Windows服務?
下面按“隔一定時間做一些相同的事情”的服務為例,說明Windows服務如何?。
先按普通Windows程式設計好你的程式邏輯。
建立一個空白解決方案WindowsService.sln
添加Windows類庫項目ServiceBusiness.csproj
將Class1.cs改名為ServiceBusiness.cs
添加一個方法Dothings(),這個方法用來每隔一段時間調用一次,做些周期性的事情。
using System;
namespace ServiceBusiness
{
public class ServiceBusiness
{
public void Dothings()
{
//隔一段時間調用一次
}
}
}
向解決方案添加一個WindowsService.csproj
將Service1.cs重新命名為Service.cs
給WindowsService添加ServiceBusiness項目引用
開啟Service.cs程式碼檢視,向Service類新增成員
ServiceBusiness.ServiceBusiness serviceBusiness;
在建構函式裡面對serviceBusiness執行個體化
serviceBusiness = new ServiceBusiness.ServiceBusiness();
在using位置添加System.Theading
using System.Threading;
給Service類添加計時器
Timer serviceTimer;
添加TimeCallback方法,用於計時器調用
public void TimerCallback(object obj)
{
//隔一段時間調用一次
serviceBusiness.Dothings();
}
在OnStart()方法中添加方法,用於啟動計時器
serviceTimer = new Timer(new TimerCallback(TimerCallback), state, 0, period);
此處,state用於儲存狀態,如果不需要,儲存狀態,可以傳入null。第三個參數0表示立即調用TimerCallback方法,如果不需要立即調用,可以傳入period。period是計時器的計時間隔,單位為毫秒。
重載 OnPause ()和OnContinue ()方法,對計時器進行控制。
Service.cs代碼如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Threading;
namespace WindowsService
{
public partial class Service : ServiceBase
{
Timer serviceTimer;
ServiceBusiness.ServiceBusiness serviceBusiness;
int period;
object state;
public Service()
{
InitializeComponent();
serviceBusiness = new ServiceBusiness.ServiceBusiness();
}
protected override void OnStart(string[] args)
{
//啟動timer
period = ServiceSettings.Default.ServiceTimerIntervalSecond * 1000;
serviceTimer = new Timer(new TimerCallback(TimerCallback), state, 0, period);
}
protected override void OnStop()
{
//停止計時器
serviceTimer.Change(Timeout.Infinite, Timeout.Infinite);
}
protected override void OnContinue()
{
//重新開始計時
serviceTimer.Change(0, period);
}
protected override void OnPause()
{
//停止計時器
serviceTimer.Change(Timeout.Infinite, Timeout.Infinite);
}
public void TimerCallback(object obj)
{
//隔一段時間調用一次
serviceBusiness.Dothings();
}
}
}
開啟Program.cs檔案
為了調試方便,在Main方法中,直接加入調用Dothings()。這樣就可以在IDE中方便偵錯工具。
using System.Collections.Generic;
using System.ServiceProcess;
using System.Text;
namespace WindowsService
{
static class Program
{
/// <summary>
/// 應用程式的主進入點。
/// </summary>
static void Main(string[] args)
{
#if DEBUG
ServiceBusiness.ServiceBusiness serviceBusiness = new ServiceBusiness.ServiceBusiness();
//在偵錯模式下,直接調用
serviceBusiness.Dothings(args);
#else
ServiceBase[] ServicesToRun = new ServiceBase[] { new Service() };
ServiceBase.Run(ServicesToRun);
#endif
}
}
}
作者:閃電
來自:baiguli.cnblogs.com