c# - 将 SqlDataReader 传递给多个线程时是否应该通过引用传递 SqlDataReader

标签 c# multithreading

作为 C# 新手,我在不同线程之间传递 SqlDataReader 时遇到了这个“难题”。无需过多讨论,其想法是让主线程从数据库(大型记录集)中获取数据,然后让辅助任务逐条记录地运行该记录,并根据其内容执行一些操作。记录集没有反馈,它只是简单地遍历,直到没有记录留下。 这工作得很好,但考虑到手头作业的性质,应该可以将该作业分布在不同的线程(CPU)上以最大化吞吐量(执行顺序并不重要)。那么问题就变成了,当我在 SqlDataReader 中传递这个记录集时,我是否必须使用 ref ?这归结为一个问题:如果我在不指定 ref 的情况下传递对象,它是否会在内存中创建新副本并处理记录 n 次?或者,我是否会冒在尚未完全读取所有字段的情况下将记录位置向前移动的风险?后者看起来更像是一个“数据竞赛”问题,并且可能被 lock()ing 机制所涵盖(或没有?)。

我对这个问题的最初看法是,使用 ref 传递变量并没有真正的伤害,但正如一位同事所说:“只有当你做错事时才需要 ref” =) 另外,使用 ref 也限制了我应用 using() 构造,这也不是很好。 因此,我创建了一个“基本”项目,它采用相同的方法,但没有引用符号。到目前为止的测试表明,它可以在使用任意数量线程的 Core2Duo(2cpu)上完美运行,但我仍然有点警惕...... 对此,各位专家有何看法?是否使用 ref ?

您可以找到测试项目here看来我无法直接将其上传到这个问题?!?

ps:这只是一个测试项目,我是c#新手,所以在分解代码时请对我温柔一点=P

最佳答案

不要将 SqlDataReader 传递给多个线程。 documentation says这个类不是线程安全的。

即使是这样,您也会遇到由此产生的各种计时问题,尤其是在处理 SqlDataReader 时。除此之外,SqlDataReader 已经在另一个线程上流式传输数据,我认为您过早地进行了优化。

关于c# - 将 SqlDataReader 传递给多个线程时是否应该通过引用传递 SqlDataReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2966664/

相关文章:

java - 在ArrayBlockingQueue中,为什么将final成员字段复制到本地final变量中?

c++ - std::async 将创建和异步执行的最大线程数是多少?

java - 简单的守护线程不输出消息

java - 用于在线程中发出信号的信号量不起作用(并发问题)

C# - 阅读器关闭时调用 Read 的尝试无效

c# - DataGridView如何实现自动滚动?

c# - 从列表 C# 的列表中获取内部列表

multithreading - 单元测试一个线程类,避免在测试中使用 Thread.Sleep()?

c# - 我是否需要安装 microsoft sql server 或者它默认随 visual studio community 2017 一起提供?

c# - 根据用户输入寻找数组中的最大值 (C#)