首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于MVC应用程序中慢操作的线程

用于MVC应用程序中慢操作的线程
EN

Stack Overflow用户
提问于 2014-05-23 06:41:34
回答 1查看 94关注 0票数 1

当新用户在我的网站注册时,我要求他们通过向他们发送一封带有独特链接的电子邮件来验证他们的电子邮件。

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

为了解决这一问题,我正在这样做:

代码语言:javascript
运行
复制
Thread emailRequestThread = new Thread(() => (new EmailSender()).SendConfirmAdressEmail(user));
emailRequestThread.Start();

这是可行的,但这是个坏主意吗?如果是这样的话,我应该如何完成同样的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-23 07:47:44

与其推出一个新的Thread来发送邮件,不如采用async方法。我们在这里做的是用一个StmpClient.SendAsync封装Task模式,这样我们就可以等待使用它的TaskAwaitable了。

代码语言:javascript
运行
复制
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;
}

然后用这样的方式:

代码语言:javascript
运行
复制
Task sendTask = await client.SendAsyncTask(message);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23822596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档