C#---寫出一個Timer用來監控SMTP

摘要:C#---寫出一個Timer用來監控SMTP

最近二天都在寫監控程式 (不知道是我太笨還是真的不好寫)

工作項目大概如下:

專案的類型是WinForm   語言是C#

要把一些值設成參數存在  (例如:監控路徑、Log路徑、SMTP 的參數) 

程式大概就是針對 所設定的監控路徑去Monitor 裡面的東西,但因為要寫的比較有彈性,路徑的部份我切割了4個參數存在config

利用Path.Combin 這個方法兩兩串連( 4.0好像支援N個,我用3.5的一次只能兩個)、這樣就不用自己打一堆斜線,畫面看起來乾淨多

之後就開始利用System.IO裡面的Files跟Directory 等等  資料或目錄相關的namespace的東西 來達到監控的目地

也搭配一堆catch,把錯誤寫到自己設定的LogFile裡面,第一天就大概寫了這些東西,應該算快吧(學習中)。

 

到了第二天,同事說要加入寄信功能,然後他把之前他寫的Email Class寄給我,讓我不用再寫一次  (其實是半成品的版本,因為成品他找不到了  哈)

不過還好coding的能力經過前公司的壓迫之下,訓練有素,所以看別人寫的code就不會那麼痛苦 ( 還好同事寫的很有條理,少部份沒註解而以,才能說大話  哈)

 

廢話不多說,拿到class後,就開始著手修改加入「計時器」的功能。

為什麼要加「計時器」呢?  因為信透過SMTP寄出後  ,如果用 SendAsyn()  非同步傳送的話,需要委派一個 SendCompletedEventHandler到 SendCompleted

那他會接收SMTP回傳過來的參數,用來判斷信到底是成功寄出還是寄送失敗。 (我設一個global bool變數,如果有回傳動作,不管成功失敗就會把該變數設成false,預設True)

 

問題來了, 我用System.Threading裡面的Timer來寫「計時器」,每三秒去Check一次,

那個global bool變數有沒有變false,如果有的話我就把Timer 利用Dispose() 關掉,超過15秒沒有變的話就會在Log寫入「寄信逾時」。

想說這樣沒問題,結果一測,信件明明都有寄成功,Log還是有出現「寄信逾時」,而且  Log裡  信件的時間居然跟「寄信逾時」的時間一樣,太不合理了。

之後我設了幾個中斷點去跑,發現,那個Timer把整個程式咬住,表面上是3秒去Check一次,但始終跑不到SendCompleted那邊 (正常測試 寄件7秒,所以確定是timer咬住了)

 

後來想說用while(true)  搭配 Thread.Sleep跟條件來判斷什麼時候要break,還是 會發生一樣的情況。

目前我就把寄出的方法改用Send () 一般傳送,搭配catch去抓錯,有一個SmtpException有包含逾時這個錯誤 (MSDN寫的),應該是看SMTP的timeout參數設定(在config檔裡)

現在是可以正常跑,但是我想知道的是…

 

用Thread 這個類別來寫,不是就代表我開另外一個執行緒來跑Timer了嗎  (還是其實並沒有?)  

如果是的話,為什麼會咬住主程式在跑的那個執行緒不放?  

 

希望有高手能夠協助我,感謝~~