当新用户在我的网站注册时,我要求他们通过向他们发送一封带有独特链接的电子邮件来验证他们的电子邮件。
如果我与同步执行此操作,则页面返回大约需要3-5秒,因为电子邮件方法需要一些时间才能完成。
为了解决这一问题,我正在这样做:
Thread emailRequestThread = new Thread(() => (new EmailSender()).SendConfirmAdressEmail(user));
emailRequestThread.Start();
这是可行的,但这是个坏主意吗?如果是这样的话,我应该如何完成同样的结果?
发布于 2014-05-23 07:47:44
与其推出一个新的Thread
来发送邮件,不如采用async
方法。我们在这里做的是用一个StmpClient.SendAsync
封装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);
https://stackoverflow.com/questions/23822596
复制相似问题