![](/img/trans.png)
[英]Should I use Thread.Sleep() to check if a process is still running?
[英]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消息時,用戶將等待網頁響應,這將有一個延遲。
我建議這樣的事情:
Task.Factory.StartNew
)以處理數據庫中的SMS消息。 Thread.Sleeep
完成)發送它們。 該解決方案將消息發送的工作分擔給后台任務,該任務可以像所需的那樣慢,並且即使使用了應用程序池,也可以使用數據庫引入持久性來避免丟失消息。
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.