国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

Visual C#中調(diào)用Windows服務(wù)初探

2024-07-21 02:27:17
字體:
供稿:網(wǎng)友

 windows服務(wù)是獨(dú)立于登錄用戶而工作的windows應(yīng)用程序,它通常在計(jì)算機(jī)啟動(dòng)時(shí)開始執(zhí)行,且常常連續(xù)執(zhí)行,直到計(jì)算機(jī)關(guān)閉為止。像exchange server,iis和殺毒軟件等都使用這種方式,這樣就可以獨(dú)立于某一用戶而且可以在任何用戶登錄前來運(yùn)行,同時(shí)也可以服務(wù)于所有的進(jìn)程,從而以一種服務(wù)的形式存在。

  正因?yàn)閣indows服務(wù)有著這么多的特性,因此,當(dāng)需要一些特殊功能的時(shí)候就可以考慮使用windows服務(wù)來解決問題。比如下面我們要做的這個(gè)例子。對(duì)于我們這些程序設(shè)計(jì)人員,計(jì)算機(jī)是在一起工作時(shí)間最長的伙伴,每天都會(huì)對(duì)著它的屏幕八個(gè)小時(shí)以上,還不包括下班后在家打游戲的時(shí)間,因此,保護(hù)眼睛是最重要的了。問題的起因來源于本人周六去眼科對(duì)激光手術(shù)的復(fù)查,大夫一再向我強(qiáng)調(diào)眼睛的自我調(diào)節(jié)能力,就是說只要你能保證你每隔一個(gè)小時(shí)左右就閉眼休息或向遠(yuǎn)處眺望,離開電腦屏幕,那么已經(jīng)治好的近視就不會(huì)反彈。本人雖是自律性比較強(qiáng)的人,但在計(jì)算機(jī)屏幕面前就不再如此了,往往幾個(gè)小時(shí)也不抬頭一次,為了眼睛的健康,我決定把這個(gè)艱巨的任務(wù)交由計(jì)算機(jī)來完成,讓它在一小時(shí)左右自動(dòng)提醒我休息五分鐘。如此一來,豈不是再也不用顧慮這件事了。

  功能雖然簡單,但要寫個(gè)程序放在啟動(dòng)組里每天自動(dòng)運(yùn)行也不是一個(gè)好的辦法,正巧以前也沒做過windows服務(wù),不如索性來試一試,同進(jìn)也看看.net為我們提供了多么先進(jìn)的功能吧,于是決定,就用c#來做一個(gè)提醒我保護(hù)眼睛的windows服務(wù),取名就叫careeye吧。

  運(yùn)行visual studio.net 2003,建立一個(gè)c#的windows服務(wù)項(xiàng)目,在careeye.cs的設(shè)計(jì)視圖提示可以把需要的控件和組件拖動(dòng)到這上面,假如想要做系統(tǒng)日志的話當(dāng)然就可以把eventlog組件拖過來了,不過這個(gè)程序好像不需要這些東西,還是算了吧。那么計(jì)時(shí)要不要采用計(jì)時(shí)器控件呢?想了一下,這個(gè)控件雖然好用,但太常用了,本著學(xué)習(xí)新知識(shí)的原則,最恰當(dāng)?shù)目峙戮褪蔷€程了,而且在以后做其他windows服務(wù)的時(shí)候線程肯定是必需的,所以還是用線程好,這樣我只要在線程中完成對(duì)時(shí)間的監(jiān)測,把線程的啟動(dòng)和停止交給服務(wù)的啟動(dòng)和停止,呵,很方便啊。

  再來看careeye.cs的源程序,一大堆沒見過的東西,不過仔細(xì)分析一下也就沒什么了。careeye類派生于servicebase類,因此繼承了基本服務(wù)類的特性,顯然main()方法會(huì)由scm(服務(wù)控制管理程序)調(diào)用,在這個(gè)方法中run一個(gè)新的careeye實(shí)例,這樣就運(yùn)行了一個(gè)windows服務(wù),onstart()和onstop()明顯是用于啟動(dòng)和停止服務(wù)的響應(yīng)函數(shù)了。

  注意在main()方法中有一個(gè)servicebase[]的數(shù)組,它是為那些一個(gè)服務(wù)進(jìn)程包含多個(gè)服務(wù)準(zhǔn)備的,對(duì)于這個(gè)程序來說,它只有一個(gè)careeye服務(wù),因此完全可以把這個(gè)數(shù)組刪除,而只是使用system.serviceprocess.servicebase.run(new careeye());一句就夠了。

  接下來為了使用線程,需要引入system.threading命名空間,為了使用對(duì)話框,還需要引入system.windows.forms命名空間,這是為了將來提示用戶時(shí)顯示對(duì)話框而準(zhǔn)備的。

  下面為類careeye添加一個(gè)成員字段private thread mainthread;同時(shí)在構(gòu)造函數(shù)中對(duì)其進(jìn)行初始化:

mainthread=new thread(new threadstart(threadfunc));
mainthread.priority=threadpriority.lowest; 

  這里把線程的優(yōu)先級(jí)設(shè)到最低,這樣不會(huì)耗用過多的系統(tǒng)性能。這個(gè)線程對(duì)象使用threadfunc作為線程函數(shù),因此將這個(gè)線程函數(shù)補(bǔ)充完整:

public static void threadfunc()
{
 int lasthour=datetime.now.hour;
 while (true)
 {
  system.threading.thread.sleep(60000);
  if (datetime.now.hour-1==lasthour)
  {
   messagebox.show("為了愛護(hù)您的眼睛,請(qǐng)您暫時(shí)休息5分鐘并向遠(yuǎn)處眺望!","警告",messageboxbuttons.ok,messageboxicon.warning,messageboxdefaultbutton.button1,
messageboxoptions.defaultdesktoponly);
   lasthour=datetime.now.hour;
  }
 }
}

  余下的代碼就簡單了,只要在onstart中啟動(dòng)線程,在onstop中停止線程就行了。

  以上的服務(wù)程序雖然很簡單,線程的處理上也不很恰當(dāng),也違背了很多服務(wù)程序的原則比如界面顯示等,但對(duì)于本人的需求而言是足夠了,因此就如此制作了。如果你有需要,當(dāng)然可以把對(duì)話框改為其他的提醒方式如響鈴等,線程也可以使用內(nèi)核對(duì)象同時(shí)使用更好的處理方法。

  windows服務(wù)就做完了,余下的就是要測試了,但發(fā)現(xiàn)這個(gè)exe無法運(yùn)行,它會(huì)提示你該exe需要使用安裝程序來安裝服務(wù),看來不可能寫一個(gè)程序就算是windows服務(wù)了,還要把它注冊(cè)到windows才行。

  接下來,右擊careeye.cs的設(shè)計(jì)視圖,添加安裝程序,(vs.net想得就是挺周到的),這下又出來一批代碼,不過好在不用改代碼了,只要把a(bǔ)ccount的賬戶類型設(shè)成localsystem,把starttype設(shè)成手動(dòng)啟動(dòng)就行了,這里用手動(dòng)是為了方便調(diào)試,以后可以改成自動(dòng)類型。

  編譯完后,還是無法運(yùn)行,此處還需要一步,就是運(yùn)行installutil來安裝這個(gè)服務(wù),其安裝和卸載的用法為:

installutil careeye.exe
installutil /u careeye.exe 

  安裝完后能過系統(tǒng)的服務(wù)管理器你就可以看到你的服務(wù)了,只要點(diǎn)擊啟動(dòng)就可以把它啟動(dòng),把時(shí)間向前改一個(gè)小時(shí)它就會(huì)提醒你需要休息了,呵呵,夠簡單了吧。

  如果你想制作成安裝包分發(fā)給自己的朋友,只需要再添加個(gè)部署項(xiàng)目就行了,不過為了完成自注冊(cè),要在自定義操作編輯器中的安裝階段添加一個(gè)自定義的安裝操作,把installerclass屬性設(shè)成true即可。

  余下的事情,就是自己動(dòng)手試試吧,這回不用擔(dān)心用眼超時(shí)了!
以下是careeye.cs的源程序:

using system;
using system.collections;
using system.componentmodel;
using system.data;
using system.diagnostics;
using system.serviceprocess;
using system.threading;
using system.windows.forms;
namespace careeye
{
 public class careeye : system.serviceprocess.servicebase
 {
  private thread mainthread;
  /// <summary>
  /// 必需的設(shè)計(jì)器變量。
  /// </summary>
  private system.componentmodel.container components = null;

  public careeye()
  {
   // 該調(diào)用是 windows.forms 組件設(shè)計(jì)器所必需的。
   initializecomponent();

   // todo: 在 initcomponent 調(diào)用后添加任何初始化
   mainthread=new thread(new threadstart(threadfunc));
   mainthread.priority=threadpriority.lowest;
  }

  // 進(jìn)程的主入口點(diǎn)
  static void main()
  {
   //system.serviceprocess.servicebase[] servicestorun;

   // 同一進(jìn)程中可以運(yùn)行多個(gè)用戶服務(wù)。若要將
   //另一個(gè)服務(wù)添加到此進(jìn)程,請(qǐng)更改下行
   // 以創(chuàng)建另一個(gè)服務(wù)對(duì)象。例如,
   //
   // servicestorun = new system.serviceprocess.servicebase[] {new careeye(), new myseconduserservice()};
   //
   //servicestorun = new system.serviceprocess.servicebase[] { new careeye() };

   system.serviceprocess.servicebase.run(new careeye());
  }

  /// <summary>
  /// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器
  /// 修改此方法的內(nèi)容。
  /// </summary>
  private void initializecomponent()
  {
   //
   // careeye
   //
   this.servicename = "careeye";

  }

  /// <summary>
  /// 清理所有正在使用的資源。
  /// </summary>

  protected override void dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.dispose();
    }
   }
   base.dispose( disposing );
  }

  /// <summary>
  /// 設(shè)置具體的操作,以便服務(wù)可以執(zhí)行它的工作。
  /// </summary>
  protected override void onstart(string[] args)
  {
   // todo: 在此處添加代碼以啟動(dòng)服務(wù)。
   mainthread.start();
  }

  /// <summary>
  /// 停止此服務(wù)。
  /// </summary>
  protected override void onstop()
  {
   // todo: 在此處添加代碼以執(zhí)行停止服務(wù)所需的關(guān)閉操作。
   mainthread.abort();
  }
  public static void threadfunc()
  {
   int lasthour=datetime.now.hour;
   while (true)
   {
    system.threading.thread.sleep(60000);
    if (datetime.now.hour-1==lasthour)
    {
     messagebox.show("為了愛護(hù)您的眼睛,請(qǐng)您暫時(shí)休息5分鐘并向遠(yuǎn)處眺望!","警告",messageboxbuttons.ok,messageboxicon.warning,messageboxdefaultbutton.button1,messageboxoptions.defaultdesktoponly);
lasthour=datetime.now.hour;
    }
   }
  }
 }

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 财经| 聊城市| 磴口县| 吉木乃县| 大理市| 民县| 本溪| 大渡口区| 五莲县| 中西区| 博客| 乌兰察布市| 罗平县| 宝应县| 江西省| 葫芦岛市| 五寨县| 通辽市| 桃源县| 台安县| 乳源| 古浪县| 安徽省| 百色市| 集贤县| 潼关县| 三原县| 儋州市| 梁山县| 万州区| 石台县| 九江县| 靖江市| 白城市| 京山县| 桑日县| 蒙自县| 全州县| 托克托县| 四川省| 湖南省|