为什么不是SmtpClient.SendAsync async?

时间:2018-05-19 02:07:23

标签: c# asynchronous async-await task task-parallel-library

参考:https://github.com/dotnet/corefx/blob/master/src/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs#L583

此方法标记为异步但返回void。它实际上是异步的,而且不是基于任务的吗?如果是这样,它是如何异步的?

2 个答案:

答案 0 :(得分:3)

在官方docs页面上有关于此方法的特定问题的一些信息。

  

要在发送电子邮件或取消操作时收到通知,请向** !ENTRY org.eclipse.equinox.launcher 4 0 2018-05-19 13:40:07.262 !MESSAGE Exception launching the Eclipse Platform: !STACK java.lang.ClassNotFoundException: org.eclipse.core.runtime.adaptor.EclipseStarter at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:626) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:584) at org.eclipse.equinox.launcher.Main.run(Main.java:1438) at org.eclipse.equinox.launcher.Main.main(Main.java:1414)** 事件添加事件处理程序。

这意味着方法不会阻塞,但是无法等待,因为它对TPL一无所知。您应该订阅SendCompleted事件。 通过提供的链接检查代码示例,以查看可能的使用方案。

虽然使用基于任务的异步模式实现SendMailAsync,但可能应该使用它。

答案 1 :(得分:0)

如果您阅读该代码,您可能会忽略AsyncOpManager - 请参阅https://github.com/dotnet/corefx/blob/master/src/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs#L662:)

然而,事实上,在下面的switch中,我们看到:

  • SmtpDeliveryMethod.PickupDirectoryFromIis:总是抛出
  • SmtpDeliveryMethod.SpecifiedPickupDirectory:似乎100%同步(直接调用message.Send(_writer, true, allowUnicode)writer.Close_transport.ReleaseConnection
  • SmtpDeliveryMethod.Network/default:似乎100%异步(_transport.BeginGetConnection开始运行,我看不到任何等待或继续)

(至少如果我读好代码,那我就没有深入挖掘)