асинхронная отправка писем через SMTP-серверы - многопоточность - PullRequest
1 голос
/ 03 марта 2012

Я создал простую форму, которая загружает CSV-файл с несколькими столбцами, такими как электронная почта, имя, город, и я пытаюсь отправлять им ежедневные обновления через 2 сервера SMTP, которые у меня есть. Я думал использовать фонового работника, потому что это возможности прогресса (для моей прогрессивной панели), но я также читал на этом сайте, что есть другие альтернативы, такие как задача, поток или пул потоков.

Я также читал, что отправка электронных писем должна выполняться асинхронным методом. Я не знаю, возможно ли это или оптимизировано для производительности, но я пытаюсь сделать следующее:

для каждого smtp я хочу использовать поток для чтения, скажем, 10 строк из файла CSV, разделите строку по полям и отправьте информацию в другой поток, который будет отправлять сообщение на каждое письмо в этом небольшом списке. Я хочу сделать это, чтобы сэкономить драгоценное время для каждой процедуры аутентификации SMTP.

Поскольку для подключения к smtp для каждого сообщения электронной почты каждый раз требуется вся процедура сокета, например HELO, AUTH, DATA. Если я собираюсь отправить список электронной почты, я могу оставить сокет открытым после авторизации и изменить только данные, которые я отправляю. 10 строк это просто переменная, которая может быть изменена пользователем. Итак, 2 задачи для каждого smtp, значит всего 4 или могут быть увеличены в зависимости от количества smtps, которое я буду использовать.

Могу ли я использовать дополнительные темы для каждой задачи или фонового работника?

Я немного растерялся, потому что я новичок в c #, и я не нашел ни одного примера по этому поводу. Прошло больше недели с тех пор, как я пытаюсь понять, как работает фоновый рабочий / потоки, но все еще безуспешно. Любая помощь будет признательна, и любая идея лучше, чем моя, чтобы улучшить производительность Спасибо!

1 Ответ

1 голос
/ 03 марта 2012

Прежде всего вам необходимо понять разницу между различными типами потоков.

Пул потоков - это просто набор потоков, доступных для использования.Потоки, используемые пулом, управляются пулом и возвращаются туда после использования.Идея в том, что вы получаете выигрыш в производительности, потому что стоимость создания потока происходит только один раз.

Фоновый рабочий - это поток, который работает в фоновом режиме.Единственное различие между фоновым потоком и потоком переднего плана, это то, что фоновый поток не будет препятствовать завершению процесса.

Отправка электронных писем в асинхронном режиме скорее СЛЕДУЕТ, чем ОБЯЗАНАКомпонент smtp не имеет понятия разделения соединения от отправки.

Я думаю, что вы хотите сделать следующее:

  • инициализировать несколько потоков, скажем, 10.
  • Читать строку из csv.
  • Передать эту строку потоку сверху.Если нет доступных потоков, подождите, пока один из них не станет.
  • В потоке проанализируйте строку и отправьте письмо.Отправка не должна быть асинхронной с этим методом, но вы можете, если хотите.Когда вы закончите отправку, верните поток в пул, готовый к следующей строке

Вы можете управлять своими потоками как пулом - есть много примеров, если вы ищете Google для пулов потоков - или выможно сделать это вручную, используя manualresetevents для обработки ожидания.Преимущество работы с пулом состоит в том, что вы можете легко изменять количество доступных рабочих, не влияя на ваш код.

...