【问题标题】:System.Net.SmtpClient SendAsync() method's internal implementationSystem.Net.SmtpClient SendAsync() 方法的内部实现
【发布时间】:2013-11-08 09:48:12
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 正是我正在寻找的答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多