簡體   English   中英

我應該在代碼中使用thread.sleep或timer嗎?

[英]Should I use thread.sleep or timer in my code?

我有以下代碼將SMS發送給訂戶。 但是,有些短信被SMSGateway拒絕了,因為我一次發送了太多短信。 因此,我正在考慮在兩者之間進行延遲。

像這樣發送短信-

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

請指教,因為我沒有線程和計時器的經驗

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

假設這是一個服務風格的應用程序,沒有用戶界面,僅從數據庫中獲取數據並將其發送到SMS,那么Thread.Sleep(...)就可以了。

如果此應用具有用戶界面,並且您正在UI線程上運行此SMS發送代碼,則Thread.Sleep(...)將阻止您的UI。 實際上,在這種情況下,smsSender.sendSMS可能已經阻止了您的UI!

重構以使該代碼不在UI線程中就是答案。 而且您可以簡單地通過使用計時器來做到這一點,盡管您將必須重構代碼,以便將結果集緩存在本地對象中,並且計時器會遍歷該集合,一次發送一個SMS。

無論哪種情況,我都希望您在發送SMS時不會對數據庫有任何鎖定。

您的問題被標記為[asp.net],因此我假設您有一個網頁,當該網頁被請求時將發送許多SMS消息(例如,當用戶按下“提交”按鈕或HTML格式的類似內容時)。

在這種情況下,您可以有多個用戶同時請求該網頁。 另外,您也不想睡在為用戶提供網頁的線程中。 如果這樣做,則在發送SMS消息時,用戶將等待網頁響應,這將有一個延遲。

我建議這樣的事情:

  • 當您需要發送SMS消息時,會將消息存儲在數據庫的表中。
  • 在將新消息存儲在數據庫中之后,您將啟動任務( Task.Factory.StartNew )以處理數據庫中的SMS消息。
  • 您需要確保ASP.NET應用程序中沒有運行多個任務。 在數據庫中存儲新消息涉及檢查任務是否正在運行以及是否沒有啟動它。
  • 該任務將處理數據庫中所有剩余的消息,並使用適當的延遲(由Thread.Sleeep完成)發送它們。
  • 任務發送了SMS消息后,該任務將從數據庫中刪除。

該解決方案將消息發送的工作分擔給后台任務,該任務可以像所需的那樣慢,並且即使使用了應用程序池,也可以使用數據庫引入持久性來避免丟失消息。

Thread.Sleep似乎設計不好。 請參閱http://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/了解Thread.sleep為何不好。

計時器更准確,僅保證Thread.Sleep至少在您指定的時間量內等待(操作系統可能使它進入睡眠時間更長)。

Thread.Sleep更合適,因為它可以更好地建模waiting方面。

Thread.Sleep()應該是延遲調用SMS網關以防止服務器拒絕您的請求的好選擇。

我認為不是Thread.Sleep()占用了CPU。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM