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();
}
}
cmd.ExecuteScalarAsync()
返回一个任务。您可能应该等待它并使DeleteRow
本身返回一个任务。如果你在它使用OpenAsync
完全异步。
ExecuteScalarAsync
的同步版本,即ExecuteScalar
。