繁体   English   中英

是否可以调用TidSMTP.Connect一次,然后从线程调用TidSMTP.Send?

[英]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在线程内部发送是否安全(缺点?)?

TidSMTPTidSMTP管理事情吗?

注意:这样做的目的是避免每次都连接(如果可能的话),如果要发送许多电子邮件,这可能是一个优势。 (为此担心或在每个线程中调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM