在多线程应用程序中共享IEnumerable 和IQueryable
|
我对如何在多线程应用程序中访问共享的ѭ0和ѭ1存有疑问。
考虑一下此代码段。
ObservableCollection<SessionFile> files = /* some code */
IEnumerable<Pattern> allFilePatterns= /*some query */
foreach (Pattern pattern in allFilePatterns)
{
string iclFilePath = Path.Combine(pattern.Location, pattern.Filename);
SessionFile sfile = new SessionFile(iclFilePath, pattern.AnalysisDate);
SomeDelegate invoker = new SomeDelegate(sfile.SomeHandler);
invoker.BeginInvoke(allFilePatterns, null, null);
files.Add(sfile );
}
如您所见,我正在使用BeginInvoke()
将相同的实例allFilePatterns
传递给每个称为sfile.SomeHandler
的处理程序。
假设在SomeHandler
中,我在foreach
循环中迭代allFilePatterns,如下所示:
void SomeHandler(IEnumerable<Pattern> allFilePatterns)
{
foreach(Pattern pattern in allFilePatterns)
{
//some code
}
}
现在我的疑问是:由于ѭ3是异步的,这意味着所有文件中所有ѭ6all中的所有ѭ7都将并行执行(每个都在其自己的线程中),, 0的共享实例是否会按预期/正常枚举?这是正确的方法吗?我可以在多个线程中共享相同的ѭ0same实例,并对其进行并行枚举吗?
如果我在上面的代码中使用IQueryable
而不是IEnumerable
怎么办?我应该注意的副作用吗?
如果它不是线程安全的,那我应该怎么用?
请注意,我正在使用ѭ1来进行数据库查询,因为我不想从数据库中提取所有数据。因此,我想尽可能避免IQueryable.ToList()
。
没有找到相关结果
已邀请:
4 个回复
乏摩纶誊伟
的某些实现也实现
,并从
返回。在这种情况下,它显然不是线程安全的... 至于“ 21”,也取决于实现方式。例如,实体框架上下文不是线程安全的,并且只能在创建它们的线程上正常工作。 因此,对于这个问题没有唯一的答案……它可能适用于某些实现,而不适用于其他实现。
靛取糕奖穿
吐兄
旗低饶彤