ExecuteNonQueryAsync在MVC应用程序中挂起

时间:2013-10-09 13:43:55

标签: sql asp.net-mvc asynchronous

我有一个我从MVC控制器调用的DAL项目。我将方法列表传递给我想要更新的对象列表。我添加了断点,它到达ExecuteNonQueryAsync(),然后挂起。该网站保持“加载”,它永远不会返回1;在我尝试将其移动到执行异步之前,查询有效(您可以看到我在哪里注释了查询的执行。我确实删除了连接打开/关闭部分,但在此之前查询工作正常。

此外,我更新了下面的代码,因此我可以使用OBJECT,ListObjects和COL1 / COL2发布它,而不是使用的实际值/对象名称。

提前致谢!

static async Task<int> NonQuery(System.Data.SqlClient.SqlConnection conn, System.Data.SqlClient.SqlCommand cmd)
    {
        await conn.OpenAsync();
        await cmd.ExecuteNonQueryAsync();
        return 1;
    }

public static bool updateQuery(List<OBJECT> listObjects)
    {
        string cnn = System.Configuration.ConfigurationManager.ConnectionStrings["connstring"].ToString();
        using (System.Data.SqlClient.SqlConnection mySqlConnection = new System.Data.SqlClient.SqlConnection(cnn))
        {
            StringBuilder SQLQuery = new StringBuilder();

            SQLQuery.AppendLine("UPDATE TABLENAME ");
            SQLQuery.AppendLine("SET COL1 = @COL1, ");
            SQLQuery.AppendLine("WHERE COL2 = @COL2 ");

            //mySqlConnection.Open();

            foreach (ObjectType ot in listObjects)
            {
                System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(SQLQuery.ToString(), mySqlConnection);

                cmd.Parameters.Add("@COL1", System.Data.SqlDbType.Int).Value = COL1VALUE;
                cmd.Parameters.Add("@COL2", System.Data.SqlDbType.Int).Value = COL2VALUE;

                int result = NonQuery(mySqlConnection, cmd).Result;

                //cmd.ExecuteNonQuery();
            }
            //mySqlConnection.Close();
        }

1 个答案:

答案 0 :(得分:1)

As I describe on my blog,这是将代码转换为async时的常见问题。正确的解决方案是使用Result替换所有Waitawait次呼叫,如下:

public static async Task<bool> updateQueryAsync(List<OBJECT> listObjects)
{
  ...
  int result = await NonQueryAsync(mySqlConnection, cmd);
  ...
}

static async Task<int> NonQueryAsync(SqlConnection conn, SqlCommand cmd)

我还将async方法更改为Asyncspecified by the TAP documentation