【问题标题】:asynchronously send emails via smtp servers - multithreadingsend emails通过 smtp 服务器异步发送电子邮件 - 多线程发送电子邮件
【发布时间】:2012-03-21 16:49:09
【问题描述】:

我创建了一个简单的表单,该表单正在加载一个包含电子邮件、姓名、城市等几列的 csv 文件,并且我正在尝试通过我拥有的 2 个 smtp 服务器向它们发送每日更新。我想使用后台工作程序,因为它是进度功能(对于我拥有的进度条),但我还在这个网站上看到还有其他替代方案,如任务、线程或线程池。

我还读到必须使用异步方法发送电子邮件。我不知道这是否可能或是否针对性能进行了优化,但我正在尝试执行以下操作:

对于每个 smtp,我想使用一个线程来读取 csv 文件中的 10 行, 按字段拆分行并将信息发送到另一个线程,该线程会将消息发送到该小列表中的每封电子邮件。我想这样做是为了为每个 smtp 身份验证程序节省一些宝贵的时间。

因为每次连接到每封电子邮件的 smtp 都需要整个套接字过程,例如 HELO、AUTH、DATA。如果我要发送电子邮件列表,我可以在身份验证后保持套接字打开,并且只更改我发送的数据。 10 行只是一个可以自定义更改的变量。 因此,每个 smtp 有 2 个任务,总共意味着 4 个,或者可以根据我将使用的 smtp 数量增加。

我还可以为每个任务或后台工作人员使用额外的线程吗?

我有点困惑,因为我是 c# 新手,但我还没有找到任何关于此的示例。自从我试图了解 backgroundworker/threads 如何工作但仍然没有成功以来,已经有一个多星期了。任何帮助都将不胜感激,任何比我更好的想法来提高性能谢谢!

【问题讨论】:

    标签: c# multithreading sockets smtp backgroundworker


    【解决方案1】:

    首先你需要了解不同类型线程之间的区别。

    线程池只是可供使用的线程的集合。池使用的线程由池管理并在使用后返回。这个想法是您可以获得性能优势,因为创建线程的成本只发生一次。

    后台工作者是在后台运行的线程。后台线程和前台线程的唯一区别是后台线程不会阻止进程终止。

    异步发送电子邮件更应该而不是必须。 smtp 组件没有将连接与发送分开的概念。

    我想你想做的是:

    • 初始化多个线程,比如 10 个。
    • 从 csv 中读取一行。
    • 将此行从上面传递给线程。如果没有可用的线程,请等到有一个。
    • 在线程中解析行并发送邮件。发送不需要与此方法异步,但如果您愿意,可以。完成发送后,将线程返回到池中,为下一行做好准备

    您可以将线程作为一个池来管理 - 如果您在谷歌上搜索线程池,会有很多示例 - 或者您可以使用手动重置事件来处理等待。使用池执行此操作的优点是您可以轻松更改可用工作人员的数量,而不会影响您的代码。

    【讨论】:

    • 感谢您的回复!所以,你是说我应该只使用线程池而不是任务/后台工作人员/线程,对吧?你这么说只是因为你认为我实现它会更容易还是因为方法性能?我不是要求最简单的方法来做到这一点,我需要基于我发布的信息的最佳方法。之后我可以在谷歌上搜索如何做到这一点。我还阅读了仅在新的视觉工作室中可用的 await 和 async ,我想要一些像它们一样的东西,我的意思是这些线程在它们待处理时用于其他东西。
    • 通过创建线程,您正在使用后台工作者。您将它们作为一个集合进行管理,即线程池。通过这种方式,您将获得最佳性能和易于实施。虽然 await 和 async 关键字是 .net 4.5 的新关键字,但仍处于测试阶段,框架中仍有许多异步方法。查找 beginxxxx 方法,例如邮件组件上的 beginSend。
    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2016-02-09
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多