我是新的C#。我正在运行一个循环向订阅用户发送电子邮件。我需要减慢循环,因为我只想发送10封电子邮件/秒。是使用Thread.sleep很好的方法来减缓循环?请参阅下面的代码。使用线程来减慢循环
while (rdr.Read())
{
System.Threading.Thread.Sleep(100);
//send email code here
}
感谢
我是新的C#。我正在运行一个循环向订阅用户发送电子邮件。我需要减慢循环,因为我只想发送10封电子邮件/秒。是使用Thread.sleep很好的方法来减缓循环?请参阅下面的代码。使用线程来减慢循环
while (rdr.Read())
{
System.Threading.Thread.Sleep(100);
//send email code here
}
感谢
你为什么不有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;
}
}
总之 - 不 - 你原来的做法是不好的。
如果这是你应该使用计时器通过Queue
工作GUI应用程序。在一个单线程控制台应用程序中,可能没问题。如果你的代码是在一个单独的线程Thread.Sleep
是确定的。
我建议你不要阻止读者太久。但是我们不知道读者背后有什么。
是的,你可以这样做,但rdr的类型是什么?如果是SqlDataReader的或其他一些参考外部数据(文件,数据库,网络等),最好先获取所有数据比保持RDR开了很长一段时间
这是一个很好的点ArsenMkrt。是的,它是一个SqlDataReader – Waqar 2012-02-23 16:36:43
是使用的Thread.sleep好办法减慢循环?
哼,什么,不!
我需要循环减慢,因为我只想发送10个电子邮件/秒
如果这是你的规范,然后写这将遵守该规范的代码!睡觉,因为你正在使用它并不能确保规格。使用Timer
即触发一次第二,并在10个最电子邮件发送,或写,保证它仅提供每秒10项的队列。
在您定义的方法中没有看到任何问题,至少在提供的问题上看。 我想象,你发送的邮件10,并等待一段时间后,让他们从发件箱中走出,出于某种原因。
每秒10封电子邮件? – 2012-02-23 16:28:29
我希望你不要误用这个来散布垃圾邮件。 – BlueM 2012-02-23 16:34:05
nope。我将每周向订阅的用户发送电子邮件。 – Waqar 2012-02-23 17:46:59