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

时间:2013-10-29 09:54:44

标签: c# .net threadpool async-await smtpclient

我想知道System.Net.SmtpClient的SendAsync()方法的内部实现的内部实现,如果它使用ThreadPool的Thread或仅使用当前的同步上下文??

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

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

1 个答案:

答案 0 :(得分:14)

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

  • SendAsync是旧式方法。它从.NET 2.0开始存在,不使用ThreadPool。相反,它使用AsyncOperationManager启动异步操作,并在事件完成时发出信号。显然,除非使用TaskCompletionSource进行包装,否则不能将其与async/await一起使用。
  • SendMailAsync是“新”方法,它只使用TaskCompletionSource包装SendAsync并返回您可以await开启的任务。

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

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