当新用户在我的网站上注册时,我要求他们通过向他们发送包含唯一链接的电子邮件来验证他们的电子邮件。
如果我与控制器注册操作同步执行此操作,则返回页面大约需要3-5秒,因为电子邮件方法需要一些时间才能完成。
为了解决这个问题,我这样做:
Thread emailRequestThread = new Thread(() => (new EmailSender()).SendConfirmAdressEmail(user));
emailRequestThread.Start();
它有效,但这是一个坏主意吗? 如果是这样,我应该如何实现相同的结果呢?
答案 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);