c# - 'using' block 线程安全吗?

标签 c# multithreading concurrency thread-safety

如果我从多个线程调用一些数据访问方法,我是否需要锁定数据库调用周围的代码以确保一致性,或者 using 语句是否是原子的?

public static DataRow GetData(Int32 id)
{
    using (SqlConnection con = new SqlConnection(connectionString);)         
    {
        con.Open();
        SqlCommand cmd = ...
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(...)
        cmd.Parameters.Add(...)
        DataTable dt = new DataTable();
        return new SqlDataAdapter(cmd).FillWithRetry(dt, sqlGetEmail.CommandText);
    }
}

我认为一个线程不会影响另一个线程定义和“使用中”的连接对象。

最佳答案

Using 语句与线程安全(或缺乏)无关

它们只是确保在 block 结束时调用所用对象的 Dispose 方法;但在其他方面等同于手动 try..finally Dispose

在这种特殊情况下:由于在每个线程上都打开了一个 连接,因此它是“线程安全的”。它仍然可能不是原子的。数据库或其他共享状态。

关于c# - 'using' block 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870434/

相关文章:

c# - 使用 EF CF 将复杂对象插入数据库的奇怪问题

java - 找不到 URL 内容时更快失败,howto

concurrency - 在达到超时之前如何读取 UDP 连接?

multithreading - std::this_thread::yield()用法?

c# - Swashbuckle/Swagger 没有从配置中获取路由

c# - 在循环中处理 SaveChanges 异常

c# - .NET 框架库中的 ref 关键字示例

c++ - sigwait()在多线程程序中不起作用

java - 线程作为 Java 对象

multithreading - 这是Go中的惯用工作线程池吗?