2012-02-23 37 views
0

我是新的C#。我正在运行一个循环向订阅用户发送电子邮件。我需要减慢循环,因为我只想发送10封电子邮件/秒。是使用Thread.sleep很好的方法来减缓循环?请参阅下面的代码。使用线程来减慢循环

  while (rdr.Read()) 
      { 
       System.Threading.Thread.Sleep(100); 

       //send email code here 
      } 

感谢

+4

每秒10封电子邮件? – 2012-02-23 16:28:29

+1

我希望你不要误用这个来散布垃圾邮件。 – BlueM 2012-02-23 16:34:05

+0

nope。我将每周向订阅的用户发送电子邮件。 – Waqar 2012-02-23 17:46:59

回答

4

你为什么不有System.Timers.Timer将触发了每秒发送达从消息队列每秒十条消息。

通过这种方式,您确实可以完全控制流程,而不会猜测您的电子邮件发件人的速度/时间。

也许是这样的:

public class EmailSender 
{ 
    private System.Timers.Timer _timer = new Timer(1000); 

    public EmailSender() 
    { 
     _timer.Elapsed += (object sender, ElapsedEventArgs args) => SendEmail(); 
    } 

    public void StartSender() 
    { 
     _timer.Enabled = true; 
    } 

    public void SendEmail() 
    { 
     // you *may* want to stop your timer here in case the send of the ten overruns 1s. 
     _timer.Enabled = false; 

     // code here to send UP TO ten emails 

     // re-enable timer, if you stopped it above. 
     _timer.Enabled = true; 
    } 
} 

总之 - 不 - 你原来的做法是不好的。

  • 你怎么知道让它睡多久才能发送10条消息?
  • 如果机器运行缓慢,会发生什么情况?
  • 如果部署到更快的机器,会发生什么?
  • 等。
+0

感谢罗布所有的信息。 – Waqar 2012-02-23 16:42:02

+0

我想他想要的只是放慢速度,所以他不会被邮件服务器拒绝(我的猜测)。 – BlueM 2012-02-23 16:45:07

2

如果这是你应该使用计时器通过Queue工作GUI应用程序。在一个单线程控制台应用程序中,可能没问题。如果你的代码是在一个单独的线程Thread.Sleep是确定的。

我建议你不要阻止读者太久。但是我们不知道读者背后有什么。

0

是的,你可以这样做,但rdr的类型是什么?如果是SqlDataReader的或其他一些参考外部数据(文件,数据库,网络等),最好先获取所有数据比保持RDR开了很长一段时间

+0

这是一个很好的点ArsenMkrt。是的,它是一个SqlDataReader – Waqar 2012-02-23 16:36:43

1

是使用的Thread.sleep好办法减慢循环?

哼,什么,不!

我需要循环减慢,因为我只想发送10个电子邮件/秒

如果这是你的规范,然后写这将遵守该规范的代码!睡觉,因为你正在使用它并不能确保规格。使用Timer即触发一次第二,并在10个最电子邮件发送,或写,保证它仅提供每秒10项的队列。

0

在您定义的方法中没有看到任何问题,至少在提供的问题上看。 我想象,你发送的邮件10,并等待一段时间后,让他们从发件箱中走出,出于某种原因。