Можно ли вызвать TidSMTP.Connect один раз, а затем из потоков вызвать TidSMTP.Send? - PullRequest
0 голосов
/ 17 ноября 2010

Я пишу приложение, которое отправляет сообщения электронной почты с использованием Indy.

Каждое сообщение отправляется потоком.

В настоящее время я подключаюсь к TidSMTP внутри потока, поэтомудля отправки 10 писем мне нужно 10 потоков, и я подключаюсь 10 раз.

Безопасно ли (какие недостатки?) иметь один TidSMTP (вне потока), один раз позвонить Connectи затем вызовите TidSMTP.Send внутри потока?

Будет ли TidSMTP управлять всем правильно?

Примечание: идея состоит в том, чтобы избегать подключения каждый раз (если возможно), в случае многихэлектронные письма, которые будут отправлены, могут быть преимуществом.(имеет ли смысл беспокоиться об этом, или вызов Connect в каждом потоке вполне приемлем?).

Ответы [ 2 ]

4 голосов
/ 17 ноября 2010

Почему бы вам не использовать только 1 теаду, в которой у вас есть TIdSMTP и TList, в которой вы храните TIdMessage, и после каждой отправки вы освобождаете TIdMessage из списка, в этом случае вы избегаете накладных расходов и делаете его простым.Что если вы хотите отправить 200 электронных писем, хорошо, если вы запустите 200 потоков, тогда ваше приложение будет использовать более 200 МБ только для этих 200 потоков, не говоря уже о том, что могут возникнуть проблемы с запуском такого количества потоков в вашем приложении.Нижняя строка добавляет TList, в котором вы временно сохраняете подготовленные TIdMessages и внутри потока цикл while, который проверяет, есть ли в списке какие-либо сообщения для отправки, если он затем захватывает, отправляет и удаляет из списка.

1 голос
/ 18 ноября 2010

Технически, вы можете вызвать Connect () в одном потоке, а затем вызвать Send () в других потоках. Однако вам придется сериализовать доступ к Send (), иначе отправляющие потоки могут перекрывать друг друга и портить связь SMTP. Предложение Дорина перенести весь SMTP-трафик в один поток с очередью - лучший выбор. Однако к самой очереди необходимо обращаться потокобезопасным способом, поэтому использование простого TList или TQueue само по себе недостаточно. Либо используйте TThreadList (или собственный TIdThreadSafeList Indy) вместо TList, либо оберните TQueue отдельным TCriticalSection.

...