回答

收藏

使用Linq to SQL进行多线程

技术问答 技术问答 274 人阅读 | 0 人回复 | 2023-09-12

因为原始线程(使用)Linq to; E: O! o" _: x$ G
SQL多线程)现在已经很老了,我想我会在类似的主题上发布另一个问题。考虑一个计划,其中DomainService很多方法都是公开的SQL! k. a2 o/ E; m6 {0 ]8 w' \* u
Server数据库检索数据。显然,人们必须期望在多用户解决方案中有多个请求。this.DataContext它可以并行使用,开发人员不需要控制或付出额外的努力来处理这些要求。因此,如果我有顺序的话LINQ查询放入Parallel.Invoke(),结果会完全松开,然后我会得到内容7 e- V( z% z5 N! u0 s& K8 \
是与此命令有关的已经打开的DataReader,必须先关闭。    错误 …?
! \3 y- l5 P" |& g# d% s* M8 N+ Y# G! \0 T为了证明这一点,它可以工作:
$ R$ u, l/ g( w" d' u: UList retVal = new List();retVal.AddRange(this.DataContext.Table1.Where(w=>w.A==1).Select(s=>new Data{f1=s.D}).ToList());retVal.AddRange(this.DataContext.Table1.Where(w=>w.B==2).Select(s=>new Data{f1=s.D}).ToList());retVal.AddRange(this.DataContext.Table1.Where(w=>w.C==3).Select(s=>new Data{f1=s.D}).ToList());…但这不是:
6 P+ E7 R( d4 b* c$ [8 \9 @List retVal = new List()arallel.Invoke(()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.A==1).Select(s=>new Data{f1=s.D}).ToList(),=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.B==2).Select(s=>new Data{f1=s.D}).ToList(),=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.C==3).Select(s=>new Data{f1=s.D})).ToList());不用担心,List线程不安全,因为错误来自SQL数据连接。
# b6 E$ X# O7 {6 X! H3 ~感谢任何意见和解释。
. y% B; {. e9 z% D) q/ D/ F: p2 f                                                               
9 j: d; ?2 J" g6 @2 z6 J    解决方案:                                                               
; N! m4 c" H: u$ J                                                                首先,需要澄清的是,此问题与多线程而不是多用户有关。在多用户方案中,每个用户将拥有自己的DataContext实例避免了共享实例周围的线程问题。
! @7 p; d1 e# m/ y) d并行示例失败是因为DataContext对象不是线程安全的对象。它希望单个线程而不是多个并行线程。这是一个与数据读取器相关的例外,因为DataContext它的连接已打开,当您尝试并行执行第二条语句时,将与数据读取器一起读取。" P' N& F' v3 t* V
假如你试着不用SqlConnection在任何序列化技术的情况下,跨多线程使用一个例子,同样的问题也会很明显。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则