#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()
?