我创建了一个简单的表单,它正在加载一个csv文件,其中包含很少的列,如电子邮件,名称,城市,我正在尝试通过2个smtp服务器向他们发送每日更新。我想使用背景工作者,因为它具有进度功能(对于我的进度条),但我也在本网站上读到还有其他选择,如任务,线程或线程池。
我还读到发送电子邮件必须使用异步方法完成。我不知道它是否可能,或者它是否针对性能进行了优化,但我正在尝试执行以下操作:
对于每个smtp我想使用一个线程来读取,比如csv文件中的10行, 按字段拆分行并将信息发送到另一个线程,该线程将消息发送到该小列表中的每个电子邮件。我想这样做是为了为每个smtp auth程序节省一些宝贵的时间。
因为连接到每个电子邮件的smtp每次都需要整个套接字过程,如HELO,AUTH,DATA。如果我要发送电子邮件列表,我可以在auth后保持套接字打开并仅更改我发送的数据。 10行只是一个可以自定义更改的变量。 因此,每个smtp的2个任务,总共意味着4个,或者可以根据我将使用的smtps数量增加。
我还可以为每个任务或后台工作者使用额外的线程吗?
我有点困惑,因为我是c#的新手,我没有找到任何关于此的例子。自从我试图理解后台工作者/线程如何工作但仍未成功以来,已经有一个多星期了。任何帮助将不胜感激,任何想法比我的更好,以提高性能谢谢!
答案 0 :(得分:1)
首先,你需要了解不同类型线程之间的区别。
线程池只是可供使用的线程集合。池使用的线程由池和管理器管理。使用后返回那里。我们的想法是获得性能优势,因为创建线程的成本只发生一次。
后台工作程序是在后台运行的线程。后台线程和前台线程之间的唯一区别是后台线程不会阻止进程终止。
发送电子邮件异步更应该而不是必须。 smtp组件没有将连接形式与发送分开的概念。
我认为你想要做的是:
您可以将您的线程作为一个池进行管理 - 如果您使用谷歌搜索线程池,可以使用许多示例 - 或者您可以手动使用manualresetevents来处理等待。使用池进行此操作的优点是,您可以轻松更改可用的工作者数量,而不会影响您的代码。