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

本文关键字:方法 内部 实现 Net SmtpClient SendAsync System | 更新日期: 2023-09-27 18:37:11

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

在这个答案中,据说它使用了线程池的线程,但是当我查看 System.dll 的反编译代码时,它没有使用任何线程池(或者我可能不理解代码)。

我只是想知道这一点,因为我在发送批量电子邮件的实现中遇到了使用 SendAsync 方法或只是使用 ThreadPool.QueueUserWorkItem 中的 Send() 方法......

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

有两种

用于发送电子邮件的异步方法,尽管"较新"的方法仅调用"较旧"的方法。两者都不使用线程池,但两者都是异步的。

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

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

您最好的选择是为要发送的每封邮件或一批邮件创建一个新客户端,并使用"SendMailAsync"发送每封邮件以利用await