Извините, название немного дерьмовое, я не могу сказать это правильно.
Редактировать: я должен отметить, что это консольное приложение c #
Я создал прототип системы, которая работает следующим образом (это грубый псевдокодиш):
var collection = grabfromdb();
foreach (item in collection) {
SendAnEmail();
}
SendAnEmail:
SmtpClient mailClient = new SmtpClient;
mailClient.SendCompleted += new SendCompletedEventHandler(SendComplete);
mailClient.SendAsync('the mail message');
SendComplete:
if (anyErrors) {
errorHandling()
}
else {
HitDBAndMarkAsSendOK();
}
Очевидно, что эта установка не идеальна. Если первоначальная коллекция имеет, скажем, 10 000 записей, то она собирается создать до 10 000 экземпляров smtpclient в довольно коротком порядке настолько быстро, насколько это возможно, чтобы пройти по строкам - и, вероятно, произойдет смещение в процессе.
Моя идеальная конечная игра - это одновременная отправка 10 одновременных писем.
На ум приходит хакерское решение: добавить счетчик, который увеличивается при вызове SendAnEmail () и уменьшается при отправке SendComplete. Перед тем, как SendAnEmail () вызывается в начальном цикле, проверьте счетчик, если он слишком высокий, затем спите в течение небольшого периода времени, а затем проверьте его снова.
Я не уверен, что это такая прекрасная идея, и полагаю, что разум Улья мог бы сделать это правильно.
Я очень мало знаю о потоках и не уверен, будет ли это уместным здесь. Например, отправляя электронную почту в фоновом потоке, сначала проверьте количество дочерних потоков, чтобы убедиться, что их не слишком много. Или, если встроен какой-то тип «регулирования потока».
<ч />
Обновление
Следуя совету Стивена А. Лоу, у меня теперь есть:
- Словарь, содержащий мои электронные письма и уникальный ключ (это очередь сообщений
- Метод FillQue, который заполняет словарь
- Метод ProcessQue, который является фоновым потоком. Он проверяет очередь и отправляет любые сообщения в очереди SendAsycs.
- Делегат SendCompleted, который удаляет электронную почту из очереди. И снова вызывает FillQue.
У меня есть несколько проблем с этой настройкой. Я думаю, что я пропустил лодку с фоновой веткой, я должен порождать одну из них для каждого элемента в словаре? Как я могу заставить поток «торчать» из-за отсутствия лучшего слова, если очередь электронной почты очищает конец потока.
<ч />
окончательное обновление
Я поставил 'while (true) {}' в фоновом потоке. Если очередь пуста, она ждет несколько секунд и пытается снова. Если очередь постоянно пуста, я «ломаю» какое-то время, и программа заканчивается ... Работает нормально. Я немного обеспокоен бизнесом while (true), хотя ..