Почему SmtpClient.SendAsync не является асинхронным? - PullRequest
0 голосов
/ 19 мая 2018

Ссылка: https://github.com/dotnet/corefx/blob/master/src/System.Net.Mail/src/System/Net/Mail/SmtpClient.cs#L583

Этот метод помечен как асинхронный, но возвращает void.Это на самом деле асинхронный и просто не на основе задач?Если да, то как это асинхронно?

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Если вы читаете этот код, вы, вероятно, пропустили 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)
  • SMT/ default: кажется 100% асинхронным (_transport.BeginGetConnection начинает работу, я не вижу ожидания или продолжения)

(по крайней мере, если я хорошо прочитал код, я не копал слишком глубокоесть)

0 голосов
/ 19 мая 2018

На официальной странице docs есть информация о вашем конкретном вопросе по этому методу.

Чтобы получить уведомление, когда электронное письмо было отправлено или операция была отменена, добавьте обработчик события в событие SendCompleted.

Это означает, что метод не блокируется, но его нельзя ожидать, потому что он ничего не знает о TPL.Вы должны подписаться на событие SendCompleted.Посмотрите пример кода по предоставленной мной ссылке, чтобы увидеть возможный сценарий использования.

Хотя SendMailAsync реализован с использованием асинхронного шаблона на основе задач и, вероятно, должен использоваться вместо него.

...