通过smtp服务器异步发送电子邮件 - 多线程和电子邮件

时间:2012-03-03 11:52:16

标签: c# multithreading sockets smtp backgroundworker

我创建了一个简单的表单,它正在加载一个csv文件,其中包含很少的列,如电子邮件,名称,城市,我正在尝试通过2个smtp服务器向他们发送每日更新。我想使用背景工作者,因为它具有进度功能(对于我的进度条),但我也在本网站上读到还有其他选择,如任务,线程或线程池。

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

线程池只是可供使用的线程集合。池使用的线程由池和管理器管理。使用后返回那里。我们的想法是获得性能优势,因为创建线程的成本只发生一次。

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

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

我认为你想要做的是:

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

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