ADO.NET 的多线程

Multithreading with ADO.NET

我想select 同时从表中获取一些数据。当我尝试使用并行线程执行此操作时,会发生异常。我应该为每个 SqlCommand 使用不同的 SqlConnection 对象还是有任何技术可以在多个线程之间共享相同的 SqlConnection 并同时执行多个 SqlCommand 无一例外。

SqlConnection connection = new SqlConnection("...")
connection.Open();

List<Task> tasks = new List<Task>();

for (int i = 0; i < 10; i++)
{
    tasks.Add(Task.Run(() =>
    {
        var command = connection.CreateCommand();
        command.CommandText = "select top 1 * from Persons";
        var data = command.ExecuteReader();
        while (data.Read())
        {
            Console.WriteLine($"{data[0]} {data[1]} {data[2]}");
        }
    }));
}

await Task.WhenAll(tasks);

connection.Close();

您需要为每个并发操作建立单独的连接。由于连接被池化和重用,你可以随意在你需要的范围内创建一个新的,并在最后关闭它(它返回到池中,实际上不是 closed) .

这是大多数(所有?)数据库服务器的 on-the-wire 协议的限制。