我前几天在ASP.NET应用程序中找到了这段代码。
var task1 = Task.Run(() => CallStoredProc1());
var task2 = Task.Run(() => CallStoredProc2() );
...
var task8 = Task.Run(() => CallStoredProc8() );
Task.WaitAll(task1, task2, ..., task8);
这8个存储过程都是在同一个SQL Server数据库上的简单查询。
引入并行性的开销是否值得"在这种情况下调用8个存储过程调用可以忽略不计?如果没有,对这个反模式的好名字有什么建议吗?
答案 0 :(得分:0)
不值得。
仅执行Sql数据库过程的分离线程 - 浪费线程资源。
在你的情况下,实际上在行var task1 = Task.Run(() => CallStoredProc1());
中创建的线程没有任何用处 - 只等待数据库的响应。
而是使用ADO.NET
的异步方法,并使方法CallStoredProc1()
和CallStoredProc2()
异步。然后,您可以在ASP.NET
应用
Task proc1 = CallStoredProc1Async();
Task proc2 = CallStoredProc2Async();
await Task.WhenAll(proc1, proc2);
这样两个过程都将被发送到数据库,并在等待响应当前线程将被释放(返回到线程池)。当任务完成时,继续执行来自线程池的另一个线程。
public async Task CallStoredProc1()
{
using(var conn = new Connection("yourConnectionString"))
{
using(var command = new SqlCommand("Procedure1", conn))
{
CommandType = CommandType.StoredProcedure;
await conn.OpenAsync();
await command.ExecuteNonQueryAsync();
}
}
}