Sql ExecuteOnQueryAsync挂起在MVC应用程序中

Sql ExecuteOnQueryAsync挂起在MVC应用程序中,sql,asp.net-mvc,asynchronous,Sql,Asp.net Mvc,Asynchronous,我有一个从MVC控制器调用的DAL项目。我向该方法传递一个要更新的对象列表。我添加了断点,它到达ExecuteNonQueryAsync(),然后挂起。该网站一直在“加载”,它永远不会返回1;在我尝试将查询移动到execute async(您可以看到我注释掉查询执行的地方)之前,查询工作正常。我确实删除了连接打开/关闭部分,但在此之前查询工作正常 此外,我还更新了下面的代码,以便可以使用OBJECT、ListObjects和COL1/COL2来发布它,而不是使用实际的值/对象名称 提前谢谢 st

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

此外,我还更新了下面的代码,以便可以使用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();
        }
静态异步任务非查询(System.Data.SqlClient.SqlConnection conn,System.Data.SqlClient.SqlCommand cmd)
{
等待连接OpenAsync();
wait cmd.ExecuteNonQueryAsync();
返回1;
}
公共静态bool更新库(列出listObjects)
{
字符串cnn=System.Configuration.ConfigurationManager.connectionString[“connstring”].ToString();
使用(System.Data.SqlClient.SqlConnection mySqlConnection=new System.Data.SqlClient.SqlConnection(cnn))
{
StringBuilder SQLQuery=新建StringBuilder();
AppendLine(“更新表名”);
AppendLine(“SET COL1=@COL1,”);
AppendLine(“其中COL2=@COL2”);
//mySqlConnection.Open();
foreach(listObjects中的ObjectType ot)
{
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();
}
,这是将代码转换为
异步
时的常见问题。正确的解决方案是将所有
结果
等待
调用替换为
等待
,例如:

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

static async Task<int> NonQueryAsync(SqlConnection conn, SqlCommand cmd)
publicstaticasync任务updateQueryAsync(列出listObjects)
{
...
int result=await-nonquerysync(mySqlConnection,cmd);
...
}
静态异步任务非查询同步(SqlConnection conn,SqlCommand cmd)
我还将您的
async
方法更改为以
async
结尾,如。

,这是将代码转换为
async
时的一个常见问题。正确的解决方案是将所有
结果
等待
调用替换为
等待
,例如:

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

static async Task<int> NonQueryAsync(SqlConnection conn, SqlCommand cmd)
publicstaticasync任务updateQueryAsync(列出listObjects)
{
...
int result=await-nonquerysync(mySqlConnection,cmd);
...
}
静态异步任务非查询同步(SqlConnection conn,SqlCommand cmd)
我还将您的
async
方法更改为以
async
结尾,如下所示