自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例淺析

開(kāi)發(fā) 后端
C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例向你詳細(xì)介紹了一個(gè)C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)的準(zhǔn)備和實(shí)施的全過(guò)程,希望對(duì)你學(xué)習(xí)C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)有所幫助。

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例之前要明白的一些概念:所謂Windows后臺(tái)服務(wù),即后臺(tái)自動(dòng)運(yùn)行的程序,一般隨操作系統(tǒng)啟動(dòng)而啟動(dòng),在我的電腦 服務(wù)后應(yīng)用程序 服務(wù)里面能看到當(dāng)前電腦的服務(wù).一般而言,程序上用VC、C++寫(xiě)Windows服務(wù),但是我對(duì)這些語(yǔ)言不是很熟,一般編程用C#較多,所以就用C#語(yǔ)言寫(xiě)了一個(gè)Windows服務(wù).

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例其實(shí)需求是這樣的,做那個(gè)報(bào)價(jià)系統(tǒng)的時(shí)候加入了發(fā)短信的功能,訂單處理完即將發(fā)貨的時(shí)候要發(fā)送短信都客戶(hù)手機(jī)上,公司內(nèi)部員工處理訂單超時(shí)要自動(dòng)發(fā)短信,群發(fā)產(chǎn)品促銷(xiāo)信息到客戶(hù)手機(jī)上等,還有定時(shí)發(fā)送短信的需求,所以***面決定把發(fā)短信的模塊獨(dú)立出來(lái),以后還有什么功能方便一起調(diào)用,而最終選擇了采用Windows后臺(tái)服務(wù).

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例其實(shí)Windows服務(wù)并不好做到通用,它并不能在用戶(hù)的界面顯示一些什么信息等,它只是在后臺(tái)默默的處理一些事情,起著輔助的作用.那如何實(shí)現(xiàn)發(fā)送段信通用調(diào)用的接口呢?它們之間的信息又是如何來(lái)交互呢?數(shù)據(jù)庫(kù)!對(duì),就是它存儲(chǔ)數(shù)據(jù)信息的.而數(shù)據(jù)庫(kù)都能很方便的訪(fǎng)問(wèn)操作.把發(fā)送短信的后臺(tái)服務(wù)定時(shí)去訪(fǎng)問(wèn)一個(gè)數(shù)據(jù)庫(kù),而另外任何要發(fā)送短信的地方也訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),并插入一條要發(fā)送的短信到表里面,稍后Windows后臺(tái)服務(wù)訪(fǎng)問(wèn)該表將此短信發(fā)送出去.這可能是一個(gè)比較蠢的方法,但實(shí)現(xiàn)起來(lái)較簡(jiǎn)單.

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例首先,由于它是要安裝的,所以它運(yùn)行的時(shí)候就需要一個(gè)安裝類(lèi)Installer將服務(wù)安裝到計(jì)算機(jī),新建一個(gè)后臺(tái)服務(wù)安裝類(lèi)繼承自Installer,安裝初始化的時(shí)候是以容器進(jìn)行安裝的,所以還要建立ServiceProcessInstaller和ServiceInstaller服務(wù)信息組件添加到容器安裝,在Installer類(lèi)增加如下代碼:

  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. // 創(chuàng)建ServiceProcessInstaller對(duì)象和ServiceInstaller對(duì)象  
  9. this.spInstaller = new System.ServiceProcess.
  10. ServiceProcessInstaller();  
  11. this.sInstaller = new System.ServiceProcess.ServiceInstaller();  
  12.  
  13. // 設(shè)定ServiceProcessInstaller對(duì)象的帳號(hào)、用戶(hù)名和密碼等信息  
  14. this.spInstaller.Account = System.ServiceProcess.
  15. ServiceAccount.LocalSystem;  
  16. this.spInstaller.Username = null;  
  17. this.spInstaller.Password = null;  
  18.  
  19. // 設(shè)定服務(wù)名稱(chēng)  
  20. this.sInstaller.ServiceName = "SendMessage";  
  21. sInstaller.DisplayName = "發(fā)送短信服務(wù)";  
  22. sInstaller.Description = "一個(gè)定時(shí)發(fā)送短信的服務(wù)";  
  23.  
  24. // 設(shè)定服務(wù)的啟動(dòng)方式  
  25. this.sInstaller.StartType = System.ServiceProcess.
  26. ServiceStartMode.Automatic;  
  27.  
  28. this.Installers.AddRange(new System.Configuration.
  29. Install.Installer[] { this.spInstaller, this.sInstaller });  

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例再添加一個(gè)服務(wù)類(lèi)繼承自ServiceBase,我們可以重寫(xiě)基類(lèi)的OnStart、OnPause、OnStop、OnContinue等方法來(lái)實(shí)現(xiàn)我們需要的功能并設(shè)置指定一些屬性.由于是定事發(fā)送短信的服務(wù),自然少不了Windows記時(shí)器,在OnStart事件里我們寫(xiě)入服務(wù)日志,并初始化記時(shí)器.

  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();  

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例實(shí)例化記時(shí)器類(lèi)啟動(dòng)后,將在指定時(shí)間間隔觸發(fā)Elapsed指定事件,如上GetSettings為讀取我App.config文件里一個(gè)配置節(jié)點(diǎn)(值為30)的方法,所以上面將會(huì)每隔30秒調(diào)用TimeOut方法.而改方法就是我們發(fā)短信的具體操作.代碼如下:

  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. //刪除已經(jīng)發(fā)送成功的,并保存發(fā)送記錄  
  28. if (msg == "發(fā)送成功")  
  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.  

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例上面我們使用try、catch訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),并記錄錯(cuò)誤異常信息. 發(fā)送短信是使用發(fā)送一個(gè)Web請(qǐng)求發(fā)送出去的,要注意請(qǐng)求url字符串的編碼類(lèi)型,要與請(qǐng)求頁(yè)面編碼一致,不然會(huì)出現(xiàn)亂碼.上面我們請(qǐng)求的是智網(wǎng)通集團(tuán)短信(網(wǎng)址:http://www.09168.net/)的Web接口,通過(guò)訪(fǎng)問(wèn)他的網(wǎng)站來(lái)實(shí)現(xiàn)發(fā)短信,當(dāng)然還要傳遞一些用戶(hù)名、密碼、手機(jī)號(hào)碼和要發(fā)送的短信息等參數(shù).他的收費(fèi)平均大概為7分/條的樣子,其實(shí)我原本不想用發(fā)送Web請(qǐng)求的這樣方式來(lái)發(fā)送短信的,它本身提供了調(diào)用它發(fā)送短信的DLL,而且還有vc、delphi調(diào)用的Demo,但是沒(méi)有用C#調(diào)用的例子,我剛開(kāi)始試著用非托管動(dòng)態(tài)鏈接庫(kù)他提供的DLL,不知方法調(diào)用那里出錯(cuò)了一直都沒(méi)能成功發(fā)送出短信,所以后來(lái)就用了他的Web方式接口了.他頁(yè)面直接返回發(fā)送短信的狀態(tài)信息.返回發(fā)送成功則短信發(fā)送成功,成功后我再將此條信息從要發(fā)送短信表里刪除并保存在發(fā)送記錄表里面,以備日后方便查詢(xún).其實(shí)登陸他的官網(wǎng)進(jìn)入后臺(tái)也能方便的查詢(xún),如下圖.

保存在發(fā)送記錄表里面 

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例發(fā)送短信服務(wù)的代碼基本上搞定了,就看怎么在服務(wù)器上安裝部署了.C#寫(xiě)的Windows后臺(tái)服務(wù)不能直接安裝,需要借助.NET Framework里面的InstallUtil.exe安裝工具安裝,我們可以做成一個(gè)執(zhí)行CMD命令的文件BAT文件來(lái)安裝啟動(dòng)它,命令如下:

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

安裝啟動(dòng) 

安裝完成以后,我們可以在我的電腦管理服務(wù)里面看到才安裝上的后臺(tái)服務(wù).

后臺(tái)服務(wù) 

經(jīng)測(cè)試,采用定時(shí)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)發(fā)送短信的服務(wù)并不是很耗資源,剛啟動(dòng)的時(shí)候只占用內(nèi)存為7、8M左右,經(jīng)過(guò)在服務(wù)器上連續(xù)運(yùn)行幾天不關(guān)閉占用的內(nèi)存也只升到15M左右,運(yùn)行比較穩(wěn)定,這里提供一個(gè)短信二次開(kāi)發(fā)接口說(shuō)明,有興趣的朋友可以去下載看下.

智網(wǎng)動(dòng)力集團(tuán)短信二次開(kāi)發(fā)說(shuō)明文檔示例

特別申明:本文及內(nèi)容如非特別注明,均為本人Jonllen原創(chuàng),版權(quán)均歸原作者個(gè)人所有,轉(zhuǎn)載必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例的基本情況就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#實(shí)現(xiàn)Windows后臺(tái)服務(wù)實(shí)例有所幫助。

【編輯推薦】

  1. C#windows服務(wù)狀態(tài)改變操作淺析
  2. C#Windows服務(wù)程序開(kāi)發(fā)實(shí)例介紹
  3. C#啟動(dòng)Windows服務(wù)及關(guān)閉實(shí)例實(shí)現(xiàn)
  4. C#啟動(dòng)Windows服務(wù)的窗體程序淺析
  5. C#Windows服務(wù)程序之安裝項(xiàng)目
責(zé)任編輯:仲衡 來(lái)源: 百度空間
相關(guān)推薦

2009-08-14 11:00:16

C#創(chuàng)建Windows

2009-08-14 16:32:50

C#啟動(dòng)Windows

2009-08-27 18:09:49

C#接口的實(shí)現(xiàn)

2009-08-27 13:30:11

C# interfac

2009-08-14 16:02:50

C#啟動(dòng)windows

2009-08-24 10:37:27

C# 泛型

2009-08-14 14:17:16

C#Windows服務(wù)

2009-08-17 17:49:20

C# 枚舉

2009-09-09 13:57:28

C# XML解析

2009-08-18 13:49:21

C# 操作Excel

2009-08-27 17:59:56

C#接口定義

2009-08-14 09:50:46

C#復(fù)制構(gòu)造函數(shù)

2009-08-14 16:41:22

C#啟動(dòng)Windows

2009-08-31 15:11:23

C#調(diào)用水晶報(bào)表

2009-08-17 14:36:15

C#進(jìn)度條實(shí)現(xiàn)

2009-12-11 13:59:35

F#

2009-08-28 17:34:14

讀取word文檔

2009-08-18 16:04:12

C# 操作Excel

2009-08-19 09:42:52

C#操作Word書(shū)簽

2009-08-27 17:11:44

C# Fluent I
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)