我是新的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