想知道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/