2012-02-23 64 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,並等待一段時間後,讓他們從發件箱中走出,出於某種原因。