2012-02-17 103 views
1

我有下面的代碼發送短信給用戶。然而,一些短信被拒絕從SMSGateway,因爲我一次發送太多的短信。所以我想在兩者之間做一個延遲。我應該在我的代碼中使用thread.sleep還是timer?

發出短信這樣的 -

  foreach (DataRow row in dt.Rows) 
      { 
       //Gets Subscriber number 
       smsSender.destinationNum = Convert.ToInt64(row["callerID"]); 
       foreach (DataRow articleRow in dtArticle.Rows) 
       { 
        //Gets SMS content 
        smsSender.smsMessage = articleRow["news"].ToString(); 
        //Then send out the SMS 
        smsSendder.sendSMS(); 
       } 
      } 

請指點,因爲我有一個線程和定時器

回答

2

這取決於應用程序的體系結構。

假設這是一個服務式的應用程序,沒有用戶界面,簡單地獲取數據從數據庫中,並將其發送至短信,然後Thread.sleep代碼(...)的罰款。

如果這個程序有一個用戶界面,並且你正在運行這條短信在UI線程上發送代碼,然後Thread.sleep代碼(...)將阻止你的用戶界面。實際上,在這種情況下,smsSender.sendSMS可能已經阻止了您的用戶界面!

重構以便此代碼關閉UI線程是答案。你可以簡單地通過使用計時器來實現這一點,儘管你必須重構代碼,以便將結果集緩存在本地對象中,並且計時器遍歷一次發送一條短信的集合。

在任何情況下,我希望當你發送的短信你沒有在數據庫上的鎖。

+0

+1 _「我希望,當你發送的短信你沒有在數據庫上的鎖」 _否,顯然OP是循環這是在內存中定義一個數據表的數據行。 – 2012-02-17 09:21:24

+0

如你認爲我會用了Thread.Sleep(嘗試),因爲它只是一個服務式的應用程序。 – 2012-02-21 05:12:13

0

Thread.Sleep是比較合適的沒有經驗的,因爲它的模型更好的waiting方面。

0

Thread.sleep()方法應該是延緩打電話給短信網關,以防止服務器拒絕您的請求一個不錯的選擇。

我不認爲這是Thread.sleep代碼()這是佔用CPU的。

2

你的問題被標記爲[asp.net],所以我認爲你有一個網頁,當被請求時會發送一些短信(例如,當用戶按下「提交」按鈕或類似的HTML表單) 。

在這種情況下,您可以讓多個用戶同時請求網頁。此外,您不想睡在爲用戶提供網頁的線程中。如果你這樣做,那麼在SMS消息發送時,用戶等待網頁響應時會有延遲。

我建議是這樣的:

  • 當你需要向你發送存儲在表中的消息短信在你的數據庫。
  • 在數據庫中存儲新消息後,您將啓動一個任務(Task.Factory.StartNew)來處理數據庫中的SMS消息。
  • 您需要確保在ASP.NET應用程序中運行的任務不超過一個。將新消息存儲在數據庫中涉及檢查任務是否正在運行以及是否啓動它。
  • 該任務將處理數據庫中的所有剩餘消息,並使用適當的延遲發送它們(由Thread.Sleeep完成)。
  • 當任務發送SMS消息時,它將從數據庫中刪除。

該解決方案卸載消息發送到後臺任務的要求可慢,並使用該數據庫,以避免丟失的郵件,即使說該應用程序池被回收引入了持久性。

+0

謝謝,但我的並不涉及用戶交互。 – 2012-02-21 05:10:12

相關問題