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