我有以下代码向订阅者发送短信。然而,一些短信被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();
}
}
请提供建议,因为我对线程和计时器没有经验
答案 0 :(得分:2)
这取决于应用程序的体系结构。
假设这是一个没有用户界面的服务式应用程序,它只是从数据库中获取数据并将其发送到SMS,那么Thread.Sleep(...)就可以了。
如果此应用程序具有用户界面,并且您在UI线程上运行此SMS发送代码,则Thread.Sleep(...)将阻止您的UI。实际上,在这种情况下,smsSender.sendSMS可能已经阻止了你的UI!
重构以使此代码脱离UI线程就是答案。你可以简单地通过使用一个计时器来做到这一点,尽管你必须重构代码,以便结果集缓存在本地对象中,并且计时器迭代通过一次发送一个短信的集合。
在任何一种情况下,我都希望您在发送短信时不会锁定数据库。
答案 1 :(得分:2)
你的问题被标记为[asp.net]所以我假设你有一个网页,当被要求时会发送一些短信(例如当用户按下“提交”按钮或HTML表格中的类似内容时)。
在这种情况下,您可以让多个用户同时请求网页。此外,您不希望在为用户提供网页的线程中睡眠。如果您这样做,那么用户会在发送短信时等待网页响应时出现延迟。
我会建议这样的事情:
Task.Factory.StartNew
)以处理数据库中的SMS消息。Thread.Sleeep
完成)。此解决方案将消息发送到后台任务,后台任务可能会尽可能慢,并使用数据库引入持久性,以避免丢失消息,即使应用程序池已被回收。
答案 2 :(得分:0)
Thread.Sleep
更合适,因为它可以更好地模拟waiting
方面。
答案 3 :(得分:0)
Thread.Sleep()应该是延迟调用SMS网关以防止服务器拒绝您的请求的好选择。
我不认为是Thread.Sleep()会占用CPU。
答案 4 :(得分:0)
Thread.Sleep似乎很糟糕的设计。请参考http://blogs.msmvps.com/peterritchie/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program/关于为什么Thread.sleep是坏的。
定时器更准确,Thread.Sleep只能保证等待至少等待你指定的时间(操作系统可能让它长时间休眠)。 。