[英]Is it possible to call TidSMTP.Connect once and then from threads call TidSMTP.Send?
我正在编写一个使用Indy发送电子邮件的应用程序。
每个消息都是由线程发送的。
当前,我正在连接到TidSMTP
内部的TidSMTP
,因此要发送10个邮件,我需要10个线程,并且连接10次。
拥有单个TidSMTP
(在线程外部),调用一次Connect
,然后再调用TidSMTP.Send
在线程内部发送是否安全(缺点?)?
TidSMTP
会TidSMTP
管理事情吗?
注意:这样做的目的是避免每次都连接(如果可能的话),如果要发送许多电子邮件,这可能是一个优势。 (为此担心或在每个线程中调用Connect
完全可以吗?)。
为什么不只使用1个主题,其中有一个TIdSMTP和一个存储TIdMessage的TList,并在每次发送后从列表中释放TIdMessage,在这种情况下,您可以避免开销并保持简单。 如果您要发送200封电子邮件,那么如果您启动200个线程该怎么办,那么您的应用程序将仅对这200个线程使用200 Mb以上的内存,更不用说在应用程序中启动那么多线程可能会出现问题。 在最后一行添加一个TList,在其中临时存储准备好的TIdMessages,并在线程内的while循环内,该循环将检查列表是否有要发送的消息,如果要从列表中抓取,发送和删除。
从技术上讲,您可以在一个线程中调用Connect(),然后在其他线程中调用Send()。 但是,您必须序列化对Send()的访问,否则,发送线程可能会彼此重叠并破坏SMTP通信。 Dorin建议将所有SMTP通信移至带有队列的单个线程中是最佳选择。 但是,队列本身需要以线程安全的方式进行访问,因此仅使用普通的TList或TQueue不够好。 使用TThreadList(或Indy自己的TIdThreadSafeList)代替TList,或使用单独的TCriticalSection包装TQueue。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.