2012-02-23 2 views
0

Я новичок в C#. Я запускаю цикл для отправки писем подписчикам. Мне нужно замедлить цикл, потому что я хочу отправить только 10 сообщений в секунду. Использует Thread.sleep хороший способ замедлить цикл? см. код ниже.Использование потока для замедления цикла

  while (rdr.Read()) 
      { 
       System.Threading.Thread.Sleep(100); 

       //send email code here 
      } 

Благодаря

+4

10 сообщений в секунду? –

+1

Надеюсь, вы не злоупотребляете этим, чтобы распространять спам-письма. – BlueM

+0

nope. я буду отправлять еженедельные письма подписчикам. – Waqar

ответ

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

+0

Я думаю, что он хочет только замедление, поэтому он не отклоняется почтовым сервером (моя догадка). – BlueM

2

Если это приложение GUI, вы должны использовать таймер, чтобы работать через Queue. В однопоточном консольном приложении, которое может быть в порядке. Если ваш код находится в отдельном потоке Thread.Sleep в порядке.

Я предлагаю вам не блокировать читателя слишком долго. Но мы не видим, что стоит за читателем.

0

Да, вы можете это сделать, но какой тип rdr? Если это SqlDataReader или некоторые другие ссылки на внешние данные (файл, база данных, сети и т.д.), лучше, чтобы извлечь все данные первой, чем держать RDR открытой в течение длительного времени

+0

это хороший момент ArsenMkrt.да, это SqlDataReader – Waqar

1

Пользуется Thread.sleep хороший способ замедлить цикл?

Да, что, нет!

мне нужно, чтобы замедлить цикл, потому что я только хочу, чтобы отправить 10 электронную почту/второго

Если это ваша спецификация, а затем написать код, который повинуется, что спецификация! Сон, когда вы его используете, не гарантирует, что спецификация. Используйте Timer, который срабатывает один раз в секунду и отправляет не более десяти электронных писем, или записывает очередь, которая гарантирует, что она обслуживает только десять пунктов в секунду.

0

Не видите проблем с описанным вами подходом, по крайней мере, глядя на предоставленный вопрос. Я убежден, что вы отправляете 10 писем, а после некоторого времени ожидания, поэтому почему-то они выходят из почтовых ящиков.

Смежные вопросы