使用线程来减缓循环

本文关键字:循环 线程 | 更新日期: 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封邮件,等了一段时间后,出于某种原因,它们从发件箱里发了出去。