gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:58:47 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com