2012-02-17 87 views
1

我有下面的代码发送短信给用户。然而,一些短信被拒绝从SMSGateway,因为我一次发送太多的短信。所以我想在两者之间做一个延迟。我应该在我的代码中使用thread.sleep还是timer?

发出短信这样的 -

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

请指点,因为我有一个线程和定时器

回答

2

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

假设这是一个服务式的应用程序,没有用户界面,简单地获取数据从数据库中,并将其发送至短信,然后Thread.sleep代码(...)的罚款。

如果这个程序有一个用户界面,并且你正在运行这条短信在UI线程上发送代码,然后Thread.sleep代码(...)将阻止你的用户界面。实际上,在这种情况下,smsSender.sendSMS可能已经阻止了您的用户界面!

重构以便此代码关闭UI线程是答案。你可以简单地通过使用计时器来实现这一点,尽管你必须重构代码,以便将结果集缓存在本地对象中,并且计时器遍历一次发送一条短信的集合。

在任何情况下,我希望当你发送的短信你没有在数据库上的锁。

+0

+1 _“我希望,当你发送的短信你没有在数据库上的锁” _否,显然OP是循环这是在内存中定义一个数据表的数据行。 – 2012-02-17 09:21:24

+0

如你认为我会用了Thread.Sleep(尝试),因为它只是一个服务式的应用程序。 – 2012-02-21 05:12:13

0

Thread.Sleep是比较合适的没有经验的,因为它的模型更好的waiting方面。

0

Thread.sleep()方法应该是延缓打电话给短信网关,以防止服务器拒绝您的请求一个不错的选择。

我不认为这是Thread.sleep代码()这是占用CPU的。

2

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

在这种情况下,您可以让多个用户同时请求网页。此外,您不想睡在为用户提供网页的线程中。如果你这样做,那么在SMS消息发送时,用户等待网页响应时会有延迟。

我建议是这样的:

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

该解决方案卸载消息发送到后台任务的要求可慢,并使用该数据库,以避免丢失的邮件,即使说该应用程序池被回收引入了持久性。

+0

谢谢,但我的并不涉及用户交互。 – 2012-02-21 05:10:12