SmtpClient.SendAsync() и IDisposable в ASP.Net MVC5

#c# #asp.net-mvc #asynchronous #asp.net-mvc-5

#c# #asp.net-mvc #асинхронный #asp.net-mvc-5

Вопрос:

В конце одного из моих методов контроллера мне нужно выполнить цикл по коллекции и отправлять электронные письма на основе бизнес-правил.

Я не хочу, чтобы этот процесс блокировал возврат от контроллера, поскольку это операция типа «запустить и забыть», и мне нужно, чтобы клиент реагировал.

Код, который я рефакторингую, в настоящее время использует SmtpClient.Send() внутри using () блока, потому что SmtpClient реализует IDisposable .

Как это обрабатывается с помощью SendAsync в MVC? Меня беспокоит SynchronizationContext, который, возможно, не будет Dispose() вызван здесь.

Код, непосредственно предшествующий завершению метода контроллера, просто:

 client.SendAsync(message, userToken: null);
  

Комментарии:

1. Dispose всегда вызывается в блоке using, он компилируется до try-finally, поэтому независимо от того, асинхронный или синхронный, Dispose должен выполняться.

2. В соответствии с тем, как SmtpClient реализовано, настоятельно не рекомендуется запускать и забывать — вы подвергнетесь высокому риску закрыть активное соединение для отправляемых или даже еще не отправленных писем. Даже если вы не вызываете Dispose напрямую, это в конечном итоге будет вызвано финализатором, когда объект будет собран, и вы не знаете, когда это может произойти. Однако использовать fire и forget для асинхронного программирования .NET в целом — плохая идея.

3. Также, если вы ожидаете SendAsync() , клиент должен быть отзывчивым. Не могли бы вы добавить больше кода, чтобы мы могли видеть, как вы используете SendAsync() ?