簡體   English   中英

為什么SmtpClient.SendAsync不異步?

[英]Why isn't SmtpClient.SendAsync async?

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

此方法標記為異步,但返回void。 它實際上是異步的,並且不是基於任務的嗎? 如果是這樣,它如何異步?

在官方文檔頁面上有關於此方法的特定問題的一些信息。

若要在發送電子郵件或取消操作時接收通知,請將事件處理程序添加到SendCompleted事件中。

這意味着方法沒有阻塞,但不能等待,因為它對TPL一無所知。 您應該改為訂閱SendCompleted事件。 通過我提供的鏈接檢查代碼示例,以查看可能的使用場景。

盡管SendMailAsync是通過基於任務的異步模式實現的,可能應該代替使用它。

如果您閱讀該代碼,則可能忽略了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開始運行,我看不到任何等待或繼續)

(至少,如果我很好地閱讀了代碼,我並沒有在那兒鑽得太深)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM