Потоки для медленных операций в приложении MVC

1

Когда новые пользователи регистрируются на моем сайте, я требую, чтобы они подтвердили свою электронную почту, отправив им электронное письмо с уникальной ссылкой.

Если я делаю это синхронно с действием регистра контроллера, для возврата страницы требуется около 3 - 5 секунд, так как метод электронной почты занимает некоторое время.

Чтобы справиться с этим, я делаю это:

Thread emailRequestThread = new Thread(() => (new EmailSender()).SendConfirmAdressEmail(user));
emailRequestThread.Start();

Он работает, но это плохая идея? Если да, то как мне добиться того же результата?

Теги:
asp.net-mvc-5
.net-4.5

1 ответ

2
Лучший ответ

Вместо того, чтобы развернуть новую 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню