C# 为什么不是';SmtpClient.SendAsync异步?

C# 为什么不是';SmtpClient.SendAsync异步?,c#,asynchronous,async-await,task,task-parallel-library,C#,Asynchronous,Async Await,Task,Task Parallel Library,参考: 此方法标记为异步,但返回void。它实际上是异步的,而不是基于任务的吗?如果是这样,它是如何异步的?在官方页面上有一些关于此方法的特定问题的信息 要在电子邮件已发送或操作已取消时接收通知,请将事件处理程序添加到SendCompleted事件中 这意味着该方法并没有阻塞,但不能等待,因为它对TPL一无所知。您应该订阅一个SendCompleted事件。 通过我提供的链接查看代码示例,以查看可能的使用场景 While是用基于任务的异步模式实现的,可能应该改为使用。官方页面上有一些关于此方法的

参考:


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

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

要在电子邮件已发送或操作已取消时接收通知,请将事件处理程序添加到
SendCompleted
事件中

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


While是用基于任务的异步模式实现的,可能应该改为使用。

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

要在电子邮件已发送或操作已取消时接收通知,请将事件处理程序添加到
SendCompleted
事件中

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


While是用基于任务的异步模式实现的,可能应该改为使用。

如果您阅读了该代码,可能会忽略AsyncOpManager-请参阅:)

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

  • SmtpDeliveryMethod.PickupDirectoryFromIis:始终引发
  • SmtpDeliveryMethod.SpecifiedPickupDirectory:似乎100%同步(直接调用
    消息。发送(\u writer,true,allowInCode)
    写入程序。关闭
    \u传输。释放连接
  • SmtpDeliveryMethod.Network/default:似乎100%异步(
    \u transport.BeginGetConnection
    启动操作,我看不到任何等待或继续)

(至少如果我把代码读得很好,我不会在那里挖得太深)

如果你读了代码,你可能忽略了AsyncOpManager-请参阅:)

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

  • SmtpDeliveryMethod.PickupDirectoryFromIis:始终引发
  • SmtpDeliveryMethod.SpecifiedPickupDirectory:似乎100%同步(直接调用
    消息。发送(\u writer,true,allowInCode)
    写入程序。关闭
    \u传输。释放连接
  • SmtpDeliveryMethod.Network/default:似乎100%异步(
    \u transport.BeginGetConnection
    启动操作,我看不到任何等待或继续)

(至少如果我仔细阅读了代码,我不会在那里挖得太深)

因为它是在TBA成为运行时的一部分之前构思和实现的,不包括下一票,尽管我确实做了一个明显的键入,但我不确定他们为什么选择async void,但是异步void在本文中解释得很好:您当然可以使用
client.SendMailAsync()
:)@mariocatch
sendaync
不是
async void
;它是一种预
异步
/
等待
,基于事件的异步方法。OTOH,
SendMailAsync
适当地返回一个
任务
,因为它是围绕TPLBE设计的,因为它在TBA成为运行时的一部分之前就已经构思和实现了,不包括下一票,尽管我确实做了一个明显的输入,但我不确定他们为什么选择async void,但是异步void在本文中解释得很好:您当然可以使用
client.SendMailAsync()
:)@mariocatch
sendaync
不是
async void
;它是一种预
异步
/
等待
,基于事件的异步方法。OTOH,
SendMailAsync
适当地返回一个
任务
,因为它是围绕TPL设计的