Когда новые пользователи регистрируются на моем сайте, я требую, чтобы они подтвердили свою электронную почту, отправив им электронное письмо с уникальной ссылкой.
Если я делаю это синхронно с действием регистра контроллера, для возврата страницы требуется около 3 - 5 секунд, так как метод электронной почты занимает некоторое время.
Чтобы справиться с этим, я делаю это:
Thread emailRequestThread = new Thread(() => (new EmailSender()).SendConfirmAdressEmail(user));
emailRequestThread.Start();
Он работает, но это плохая идея? Если да, то как мне добиться того же результата?
Вместо того, чтобы развернуть новую Thread
для отправки почты, я бы пошел с async
подходом. Что мы делаем здесь, это обернуть StmpClient.SendAsync
EAP с помощью Task
чтобы мы могли ожидать использования TaskAwaitable
:
public static Task SendAsyncTask(this SmtpClient client, MailMessage message)
{
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
Guid sendGuid = Guid.NewGuid();
SendCompletedEventHandler handler = null;
handler = (o, ea) =>
{
if (ea.UserState is Guid && ((Guid)ea.UserState) == sendGuid)
{
client.SendCompleted -= handler;
if (ea.Cancelled)
{
tcs.SetCanceled();
}
else if (ea.Error != null)
{
tcs.SetException(ea.Error);
}
else
{
tcs.SetResult(null);
}
}
};
client.SendCompleted += handler;
client.SendAsync(message, sendGuid);
return tcs.Task;
}
И затем используйте его так:
Task sendTask = await client.SendAsyncTask(message);