我正在建立一个注册屏幕。用户提交详细信息后,会向其电子邮件ID发送电子邮件,并向其提供激活链接。使用jquery Ajax(ASYNC POST REQUEST)将用户的注册详细信息提交给服务器(ASP.MVC控制器操作)。
首先将这些详细信息保存到数据库中,然后通过调用SendEmail方法将电子邮件发送给用户。
我已将此SendEmail方法创建为Async方法。以下是我实施它的方法:
public async static Task SendEmail(Dictionary<string, object> parameters, string connectionString)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand sqlComm = conn.CreateCommand();
sqlComm.CommandType = System.Data.CommandType.StoredProcedure;
sqlComm.CommandText = "emailSendingProc";
foreach (var param in parameters)
{
if (param.Value == null)
{
sqlComm.Parameters.AddWithValue("@" + param.Key, DBNull.Value);
}
else
{
sqlComm.Parameters.AddWithValue("@" + param.Key, param.Value);
}
}
await SendEmail(conn, sqlComm);
}
}
private async static Task SendEmail(SqlConnection conn, SqlCommand sqlComm)
{
try
{
await conn.OpenAsync();
await sqlComm.ExecuteNonQueryAsync();
}
catch (Exception ex)
{
//Log Exception
}
finally
{
conn.Close();
}
}
仅供参考:使用存储过程“emailSendingProc”从数据库发送电子邮件。发送电子邮件的数据库与保存注册详细信息的数据库不同。
如果电子邮件发送有任何失败(连接超时,数据库服务器没有响应等)我不希望用户体验到这一点,因此我吞下了异常但是记录了它。
此要求的Async方法的使用是否合理?
修改:
作为POC,我使用普通方法作为异步方法,并在数据库连接失败时检查浏览器请求的响应时间。我本可以上传比较图片,但没有这样做的声誉:(
我观察到,与普通方法相比,使用Async方法的响应时间非常短。以下是常规方法的实现:
public static void SendEmail(Dictionary<string, object> parameters, string connectionString)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand sqlComm = conn.CreateCommand();
sqlComm.CommandType = System.Data.CommandType.StoredProcedure;
sqlComm.CommandText = "emailSendingProc";
foreach (var param in parameters)
{
if (param.Value == null)
{
sqlComm.Parameters.AddWithValue("@" + param.Key, DBNull.Value);
}
else
{
sqlComm.Parameters.AddWithValue("@" + param.Key, param.Value);
}
}
SendEmail(conn, sqlComm);
}
}
private static void SendEmail(SqlConnection conn, SqlCommand sqlComm)
{
try
{
conn.Open();
sqlComm.ExecuteNonQuery();
}
catch (Exception ex)
{
var mess = ex.Message;
}
finally
{
conn.Close();
}
}
使用异步方法时,为什么会更快?
答案 0 :(得分:0)
是的,这是使用异步的有效方案。通过使用异步模式,您可以释放工作线程以在等待数据库响应时处理更多传入请求,从而在负载下增加可能的吞吐量。
答案 1 :(得分:0)
这不会更快地返回浏览器,使用async以这种方式允许重新使用您的线程,并且将在IO完成时完成等待。很好。
看到这个博客,不是我的,而是一个很棒的名字:)
http://blog.stephencleary.com/2013/11/there-is-no-thread.html
如果您不希望用户等待电子邮件操作,那么您应该考虑将它们排队并有一些东西来处理队列。 (我假设SQL调用可能会发送电子邮件)