用于MVC App中的慢速操作的线程

时间:2014-05-23 06:41:35

标签: c# asp.net-mvc-5 .net-4.5

当新用户在我的网站上注册时,我要求他们通过向他们发送包含唯一链接的电子邮件来验证他们的电子邮件。

如果我与控制器注册操作同步执行此操作,则返回页面大约需要3-5秒,因为电子邮件方法需要一些时间才能完成。

为了解决这个问题,我这样做:

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

它有效,但这是一个坏主意吗? 如果是这样,我应该如何实现相同的结果呢?

1 个答案:

答案 0 :(得分:2)

我没有使用新的Thread来发送邮件,而是使用async方法。 我们在这里做的是用StmpClient.SendAsync包裹Task EAP模式,以便我们等待使用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);