2012-03-03 159 views
1

我已经创建了一个简单的表单,它正在加载一个像电子邮件,名称,城市等几列csv文件,我试图通过我有2个smtp服务器发送每日更新。我以为使用背景工作是因为它具有进度功能(对于我的进度条),但我也在本网站上阅读过其他方法,例如任务,线程或线程池。通过smtp服务器异步发送电子邮件 - 多线程发送电子邮件

我还读到,发送电子邮件必须使用异步方法完成。我不知道是否有可能,或者它是否可以优化性能,但我试图做到以下几点:

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

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

我还可以为每个任务或背景工作人员使用其他线程吗?

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

回答

1

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

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

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

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

我想你想要做的是:

  • initalise多个线程,说10
  • 阅读从CSV一条线。
  • 将此行传递给上面的线程。如果没有线程可用,请等到一个线程。
  • 在线程中解析行并发送邮件。发送不需要使用此方法进行异步,但是您可以根据需要进行发送。当你完成发送,返回线程池准备下一行

您可以管理作为线程池 - 周围有很多的例子,如果你谷歌的线程池 - 或者你可以做到这一点手动使用manualresetevents处理等待。使用池的好处是您可以轻松更改可用的工作人员数量,而不会影响您的代码。

+0

感谢您的回复!所以,你说我应该只使用线程池而不是task/backgroundworker/thread,对吧?你是仅仅因为你认为实现它或者因为方法性能更容易才这样说?我并不是要求最简单的方法去做,我需要基于我发布的信息的最佳方法。之后,我可以在谷歌搜索如何做到这一点。我还阅读了有关等待和异步的信息,这些信息仅在新的Visual Studio中可用,我希望某些事情能够像他们一样行事,我的意思是这些线程在等待时用于其他事情。 – ShaMora 2012-03-03 17:48:37

+0

通过创建线程,您正在使用backgroundworkers。你将它们作为一个集合管理,即一个线程池。这样您将获得最佳性能和易于实施。虽然await和async关键字是.net 4.5的新增功能,仍处于测试阶段,但框架中仍有许多异步方法。查找beginxxxx方法,例如邮件组件上的beginSend。 – 2012-03-04 11:26:21