在多线程应用程序中共享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()
。     
已邀请:
这取决于实现方式。
IEnumerable<T>
的某些实现也实现
IEnumerator<T>
,并从
GetEnumerator()
返回。在这种情况下,它显然不是线程安全的... 至于“ 21”,也取决于实现方式。例如,实体框架上下文不是线程安全的,并且只能在创建它们的线程上正常工作。 因此,对于这个问题没有唯一的答案……它可能适用于某些实现,而不适用于其他实现。     
当作为参数传递给委托人以实际创建线程的新集合以供使用并避免出现问题时,我会“ 22”您的枚举。 但是,我想知道为什么您需要将可枚举的每个元素都进行N次(实际上是N ^ 2)次?听起来效率低下。 编辑:更新了我的意图     
看看Parallel.For和朋友们 http://msdn.microsoft.com/en-us/library/dd460693.aspx     
好吧,如果要使用不是线程安全的IQueryable(例如Entity Framework查询),您可以做的一件事是将结果枚举到一个线程中,然后根据需要将结果传递给新线程。 然后,IQueryable / IEnumerable是否是线程安全的都没有关系。     

要回复问题请先登录注册