SQL Server语句没有真正被异步c#代码执行

本文关键字:异步 代码 执行 Server 语句 SQL | 更新日期: 2023-09-27 18:06:25

我可能错过了一些简单的东西。我正在尝试创建异步调用存储过程的负载测试,我看到在SQL Profiler中正在进行调用,但它们实际上并没有执行。我已经将代码简化为下面的示例,这将导致命令在Profiler中显示为运行,即使它没有运行。如果你把AsynchronousProcessing设置为false,把ExecuteScalarAsync设置为ExecuteScalar,它会像预期的那样工作。

public static void DeleteRow()
        {
            var cs = new SqlConnectionStringBuilder();
            cs.DataSource = @"SQLDEV";
            cs.InitialCatalog = "MyDB";
            cs.IntegratedSecurity = true;
            cs.AsynchronousProcessing = true;
            string connectionString = cs.ToString();
            int rowID = 127279530;
            try 
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand(String.Concat(@"exec [dbo].[DeleteRow] @RowId=", rowID.ToString()), conn);
                    cmd.CommandType = System.Data.CommandType.Text;
                    cmd.ExecuteScalarAsync();
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

编辑:这里是我的一些原始代码,以显示我正在尝试做的事情。

IEnumerable<int> list = Enumerable.Range(127279517, 14);            
_queued = new ConcurrentQueue<int>(list);   
Task task1 = Task.Run(() => ProcessQueue());
Task task2 = Task.Run(() => ProcessQueue());
Task task3 = Task.Run(() => ProcessQueue());
Task task4 = Task.Run(() => ProcessQueue());
Task task5 = Task.Run(() => ProcessQueue());
Task.WaitAll(task1, task2, task2, task3, task4, task5);

while (_queued.TryDequeue(out rowId))
            {
                using (SqlConnection conn = new SqlConnection(connectionString))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand(String.Concat(@"exec [dbo].[DeleteRow] @RowId=", rowId.ToString()), conn);
                    cmd.CommandType = System.Data.CommandType.Text;
                    NonBlockingConsole.WriteLine(cmd.CommandText);
                    cmd.ExecuteScalarAsync();                
                }             
            }

SQL Server语句没有真正被异步c#代码执行

cmd.ExecuteScalarAsync()返回一个任务。您可能应该等待它并使DeleteRow本身返回一个任务。如果你在它使用OpenAsync完全异步。

另一方面,你可能根本不需要async。请使用ExecuteScalarAsync的同步版本,即ExecuteScalar