使用线程来减缓循环
本文关键字:循环 线程 | 更新日期: 2023-09-27 18:25:39
我是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;
}
}
简而言之——不——你原来的方法不好。
- 你怎么知道发送10条信息要睡多久
- 如果机器运行缓慢,会发生什么
- 如果部署到速度更快的机器上会发生什么
- 等等
如果这是一个GUI应用程序,则应该使用计时器来处理Queue
。在一个单线程控制台应用程序中,这可能是可以的。如果你的代码在一个单独的线程中,Thread.Sleep
就是可以的。
我建议你不要屏蔽读者太久。但我们看不到读者背后的东西。
使用Thread.sleep是减缓循环的好方法吗?
啊,什么,不!
我需要放慢循环速度,因为我只想发送10封电子邮件/秒
如果这是您的规范,那么编写符合该规范的代码!使用时睡眠不能确保规格。使用每秒启动一次、最多发送十封电子邮件的Timer
,或者编写一个队列,保证每秒只提供十件邮件。
是的,你可以做到,但rdr的类型是什么?如果是SqlDataReader或其他对外部数据(文件、数据库、网络等)的引用,最好先获取所有数据,而不是长时间打开rdr
在您定义的方法中没有发现任何问题,至少在提供的问题上是这样。我设想你发10封邮件,等了一段时间后,出于某种原因,它们从发件箱里发了出去。