由于原始线程 (使用 Linq to SQL 进行多线程处理 https://stackoverflow.com/questions/1815537)现在已经很老了,我想我应该就类似的主题发布另一个问题。考虑一个场景,其中 DomainService 公开了许多方法来从 SQL Server 数据库检索数据。显然,在多用户场景中,多个请求同时传入,人们必须期望 this.DataContext 能够并行使用,开发人员无需控制也无需付出额外的努力来处理这些多个请求。
那么为什么如果我将顺序 LINQ 查询放入 Parallel.Invoke() 中,一切都会崩溃,我会感到恐惧“已经有一个与此命令关联的打开的 DataReader,必须先将其关闭。”错误 ...?
为了证明这一点,这是有效的:
List<Data> retVal = new List<Data>();
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<Data> retVal = new List<Data>();
Parallel.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 数据连接。
任何见解和解释将不胜感激。
首先,澄清一下,这个问题与多线程有关,而不是与多用户有关。在多用户场景中,每个用户都有自己的DataContext
实例,避免共享实例周围的线程问题。
并行示例失败是因为DataContext
不是线程安全对象;它希望由单个线程使用,而不是由多个线程并行使用。这是与数据读取器相关的一个例外,因为DataContext
当您尝试并行执行第二条语句时,其连接已打开,并使用数据读取器进行读取。
如果您尝试使用一个,同样的问题会很明显SqlConnection
跨多个线程的实例,无需任何序列化技术。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)