![](/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.