并行调用存储进程——值得

本文关键字:值得 进程 存储 调用 并行 | 更新日期: 2023-09-27 18:08:02

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

并行调用存储进程——值得

不值得。

单独的线程只执行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();
        }
    }
}