我应该在我的代码中使用thread.sleep或timer吗?

时间:2012-02-17 09:13:19

标签: c# asp.net multithreading timer

我有以下代码向订阅者发送短信。然而,一些短信被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();
                }
            }

请提供建议,因为我对线程和计时器没有经验

5 个答案:

答案 0 :(得分:2)

这取决于应用程序的体系结构。

假设这是一个没有用户界面的服务式应用程序,它只是从数据库中获取数据并将其发送到SMS,那么Thread.Sleep(...)就可以了。

如果此应用程序具有用户界面,并且您在UI线程上运行此SMS发送代码,则Thread.Sleep(...)将阻止您的UI。实际上,在这种情况下,smsSender.sendSMS可能已经阻止了你的UI!

重构以使此代码脱离UI线程就是答案。你可以简单地通过使用一个计时器来做到这一点,尽管你必须重构代码,以便结果集缓存在本地对象中,并且计时器迭代通过一次发送一个短信的集合。

在任何一种情况下,我都希望您在发送短信时不会锁定数据库。

答案 1 :(得分:2)

你的问题被标记为[asp.net]所以我假设你有一个网页,当被要求时会发送一些短信(例如当用户按下“提交”按钮或HTML表格中的类似内容时)。

在这种情况下,您可以让多个用户同时请求网页。此外,您不希望在为用户提供网页的线程中睡眠。如果您这样做,那么用户会在发送短信时等待网页响应时出现延迟。

我会建议这样的事情:

  • 当您需要发送短信时,请将信息存储在数据库的表格中。
  • 在数据库中存储新消息后,您启动任务(Task.Factory.StartNew)以处理数据库中的SMS消息。
  • 您需要确保ASP.NET应用程序中只运行一个以上的任务。在数据库中存储新消息涉及检查任务是否正在运行以及是否正在启动它。
  • 该任务将处理数据库中所有剩余的消息,并使用适当的延迟发送(由Thread.Sleeep完成)。
  • 当任务发送了SMS消息时,它将从数据库中删除。

此解决方案将消息发送到后台任务,后台任务可能会尽可能慢,并使用数据库引入持久性,以避免丢失消息,即使应用程序池已被回收。

答案 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只能保证等待至少等待你指定的时间(操作系统可能让它长时间休眠)。 。