并行调用存储过程 - 值得吗?

时间:2016-09-21 15:32:44

标签: c# sql-server task-parallel-library

我前几天在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个存储过程调用可以忽略不计?如果没有,对这个反模式的好名字有什么建议吗?

1 个答案:

答案 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();
        }
    }
}