Pregunta

Estoy escribiendo un código que envía 2 códigos a 2 correos electrónicos diferentes (para verificar que el propietario de ambos correos electrónicos sea la misma persona). Y recibí el error:

System.InvalidOperationException: una llamada asíncrona ya está en progreso. Debe completarse o cancelarse antes de que pueda llamar a este método.

Bueno, simplemente puedo evitar este error enviando el segundo correo electrónico después de que se complete el envío del primero, pero la pregunta es que si tantos usuarios al mismo tiempo solicitan envío de correo electrónico (contraseña olvidada, cambio de correo electrónico, registro, ...) lo haría causa un problema? ¿O recibiré este error solo cuando se ejecuten repetidamente en la misma página?

Gracias por adelantado,
Ashkan

¿Fue útil?

Solución

El propósito del método SendAsync no es bloquear el hilo de llamada; Sin embargo, debe esperar a que finalice el método SendAsync antes de poder enviar un nuevo correo electrónico en la misma instancia de SMTPClient. En otras palabras, cree 2 instancias, uno para cada correo electrónico, y envíelos a ambos asincrónicamente si lo desea.

De MSDN:

Después de llamar a SendAsync, debe esperar a que la transmisión de correo electrónico se complete antes de intentar enviar otro mensaje de correo electrónico usando Send o SendAsync.

Otros consejos

Como señaló Icarus, tienes que esperar el SendAsync terminar antes de llamarlo en la misma instancia. Además de eso, es posible tener ThreadPool hambre, pero su kilometraje variará según su implementación. Internamente, SendMailAsync usa un ThreadPool hilo para realizar la tarea. Sin embargo, no me preocuparía si es solo un correo electrónico aquí y allá.

No hay instancias separadas no será un problema. Si muchos usuarios envían solicitudes al mismo tiempo, cada uno será de diferentes instancias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top