Это потому, что SmtpClient.SendAsync
захватывает текущий SynchronizationContext
и выполняет обратный вызов (SendCompleted
) в этом захваченном контексте, если таковой имеется.
В asp.net mvc (не основной) - каждый запрос имеет соответствующий контекст синхронизации.Вы блокируете поток, соответствующий этому контексту, с помощью
while (WaitingMails != 0)
Thread.Sleep(500);
. Это не дает возможности для выполнения обратного вызова SendCompleted
, потому что соответствующий поток заблокирован, и он заблокирован, ожидая выполнения SendComplete
, поэтому у вас есть классическийСценарий тупиковой ситуации.
Самое простое решение, с которым можно справиться, это забыть о SendAsync
и SendCompleted
и использовать async\await
возможности SmtpClient
:
SmtpClient GenMailClient = new SmtpClient();
await GenMailClient.SendMailAsync(message);
// done
Конечно, для этого выпридется переписать ваши действия asp.net mvc (по крайней мере, те, которые отправляют электронные письма) в асинхронном режиме.Если вы не хотите этого делать, другое решение:
SmtpClient GenMailClient = new SmtpClient();
GenMailClient.Send(message);
Потому что вы пытаетесь эмулировать синхронную отправку с помощью асинхронных методов.Зачем?Просто отправьте это синхронно.