c# - System.Net.SmtpClient SendAsync() 方法的内部实现

标签 c# .net threadpool async-await smtpclient

想知道System.Net.SmtpClient的SendAsync()方法的内部实现,是使用ThreadPool的Thread还是只使用当前同步上下文??

this回答说它使用了线程池的线程,但是当我查看System.dll的反编译代码时它没有使用任何线程池(或者我不理解代码)。

我只是想知道我发送批量电子邮件的实现,我被困在使用 SendAsync 方法或只是使用 ThreadPool.QueueUserWorkItem 中的 Send() 方法...

最佳答案

发送电子邮件有两种异步方法,尽管“较新”的方法只是调用“较旧”的方法。两者都不使用 ThreadPool,但都是异步的。

  • SendAsync是老式的方法。它自 .NET 2.0 以来就存在并且不使用 ThreadPool。相反,它使用 AsyncOperationManager 启动异步操作并在事件完成时发出事件信号。显然,你不能将它与 async/await 一起使用,除非你使用 TaskCompletionSource 包装它。 .
  • SendMailAsync是"new"方法,它只是用 TaskCompletionSource 包装 SendAsync 并返回一个您可以await 的任务。

在这两种情况下,执行都是异步的,因为您自己的线程在 SendAsync 完成之前不会阻塞。另一方面,每个客户端不能运行多个发送操作,无论是同步的还是异步的。

您最好的选择是为要发送的每条消息或每批消息创建一个新客户端,并使用“SendMailAsync”发送每条消息以利用 await

关于c# - System.Net.SmtpClient SendAsync() 方法的内部实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19654840/

相关文章:

c# - 在 WebKit.NET 上获取 HTTP header

.net - 方法未找到 : 'System.Type.op_Equality'

c++ - 如何加入 boost::asio::io_service?

C++ 主/工

c# - 如何在 Entity Framework 4 中切换 SQL 和 SQL CE?或者如何以编程方式更改 edmx 文件中的 "Schema Namespace"

c# - WCF 能否处理对同一终结点的同时调用?

c# - 如何确保我们只有一个实例,并且以正确的方式处理它

c# - 使用 ASP.NET MVC Core 将数据从数据库注入(inject)到类中

.net - 为什么在调试/反汇编期间我不能进入调用指令?

c# - 当前和推荐的触发异步线程的方法是什么?