我有一个我从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();
}
答案 0 :(得分:1)
As I describe on my blog,这是将代码转换为async
时的常见问题。正确的解决方案是使用Result
替换所有Wait
和await
次呼叫,如下:
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
方法更改为Async
,specified by the TAP documentation。