簡體   English   中英

異步編程C#

[英]Asynchronous Programming C#

我正在建立一個注冊屏幕。 用戶提交詳細信息后,會將電子郵件發送到其電子郵件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”從數據庫發送電子郵件。 發送電子郵件的數據庫不同於保存注冊詳細信息的電子郵件。

如果電子郵件發送失敗(連接超時,數據庫服務器無響應等),我不希望用戶遇到這種情況,因此我吞下了異常,但將其記錄下來。

為此使用異步方法是否合理?

編輯:

作為POC,我使用普通方法而非異步方法,並檢查了數據庫連接失敗時瀏覽器請求的響應時間。 我可以上傳比較圖像,但沒有聲譽:(

我觀察到,與常規方法相比,使用異步方法時的響應時間要短得多。 下面是普通方法的實現:

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();
            }
        }

有什么想法為什么使用異步方法時會更快?

是的,這是使用異步的有效方案。 通過使用異步模式,您可以在等待數據庫響應時釋放工作線程來處理更多傳入請求,從而增加了負載下的吞吐量。

這不會更快地返回瀏覽器,以這種方式使用async可以重新使用您的線程,並在IO完成時等待。 所以很好。

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

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

如果您不希望用戶等待電子郵件操作,則應考慮將他們排隊,並有一些東西來處理隊列。 (我假設SQL調用可能會發送電子郵件)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM