异步编程C#

时间:2015-03-25 14:26:17

标签: c# email asynchronous async-await

我正在建立一个注册屏幕。用户提交详细信息后,会向其电子邮件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();
            }
        }

使用异步方法时,为什么会更快?

2 个答案:

答案 0 :(得分:0)

是的,这是使用异步的有效方案。通过使用异步模式,您可以释放工作线程以在等待数据库响应时处理更多传入请求,从而在负载下增加可能的吞吐量。

答案 1 :(得分:0)

这不会更快地返回浏览器,使用async以这种方式允许重新使用您的线程,并且将在IO完成时完成等待。很好。

看到这个博客,不是我的,而是一个很棒的名字:)

http://blog.stephencleary.com/2013/11/there-is-no-thread.html

如果您不希望用户等待电子邮件操作,那么您应该考虑将它们排队并有一些东西来处理队列。 (我假设SQL调用可能会发送电子邮件)

相关问题