Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过smtp服务器异步发送电子邮件-多线程发送电子邮件_C#_Multithreading_Sockets_Smtp_Backgroundworker - Fatal编程技术网

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

C# 通过smtp服务器异步发送电子邮件-多线程发送电子邮件,c#,multithreading,sockets,smtp,backgroundworker,C#,Multithreading,Sockets,Smtp,Backgroundworker,我已经创建了一个简单的表单,它加载了一个csv文件,其中包含几个列,如email、name、city,我正试图通过我拥有的两个smtp服务器向它们发送每日更新。我想使用backgroundworker,因为它具有进度功能(对于我拥有的progressbar),但我也在这个网站上看到,还有其他选择,如任务、线程或线程池 我还读到发送电子邮件必须使用异步方法。我不知道这是否可行,或者是否针对性能进行了优化,但我正在尝试做以下工作: 对于每个smtp,我想使用一个线程来读取csv文件中的10行, 按字

我已经创建了一个简单的表单,它加载了一个csv文件,其中包含几个列,如email、name、city,我正试图通过我拥有的两个smtp服务器向它们发送每日更新。我想使用backgroundworker,因为它具有进度功能(对于我拥有的progressbar),但我也在这个网站上看到,还有其他选择,如任务、线程或线程池

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

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

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

我还可以为每个任务或backgroundworker使用额外的线程吗?


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

首先,您需要了解不同类型线程之间的差异

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

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

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

我想你想做的是:

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

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

首先,您需要了解不同类型线程之间的差异

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

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

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

我想你想做的是:

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

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

谢谢您的回复!所以,你是说我应该只使用线程池而不是任务/后台工作人员/线程,对吗?你这么说仅仅是因为你认为我更容易实现它,还是因为方法的性能?我不是要求最简单的方法来做这件事,我需要最好的方法基于我张贴的信息。之后,我可以在谷歌上搜索如何做到这一点。我还阅读了有关Wait和async的内容,它们仅在新的visual studio中可用,我希望它们的行为与它们类似,我的意思是这些线程在挂起时用于其他用途。通过创建线程,您使用的是backgroundworkers。你将它们作为一个集合(线程池)进行管理。通过这种方式,您将获得最佳性能和易实现性。虽然await和async关键字对.NET4.5来说是新的,但仍处于测试阶段,框架中仍有许多异步方法。寻找beginxxxx方法,例如邮件组件上的beginSend。感谢您的回复!所以,你是说我应该只使用线程池而不是任务/后台工作人员/线程,对吗?你这么说仅仅是因为你认为我更容易实现它,还是因为方法的性能?我不是要求最简单的方法来做这件事,我需要最好的方法基于我张贴的信息。之后,我可以在谷歌上搜索如何做到这一点。我还阅读了关于wait和async的内容,它们仅在新的visualstu中可用