Shared IEnumerable и IQueryable в многопоточном приложении

У меня мало сомнений относительно того, как общие IEnumerable и IQueryable доступны в многопоточном приложении.

Обратите внимание на этот фрагмент кода.

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 я повторяю allFilePatterns в цикле foreach , что-то вроде этого:

void SomeHandler(IEnumerable<Pattern> allFilePatterns)
{
    foreach(Pattern pattern in allFilePatterns)
    {
          //some code
    }
}

Теперь я сомневаюсь, что: с BeginInvoke () является асинхронным, это означает, что все foreach во всех SomeHandler всех файлов будут выполняться параллельно (каждый в своем собственном потоке), будет ли общий экземпляр IEnumerable перечислять как ожидалось / нормально? Это правильный подход? Могу ли я совместно использовать тот же экземпляр IEnumerable в нескольких потоках и перечислять его параллельно?

А что, если я использую IQueryable вместо IEnumerable в приведенном выше коде? Есть ли побочный эффект, о котором я должен знать?

Если это не поточно-ориентированное, то что мне использовать?

Обратите внимание, что я использую IQueryable для запросов к базе данных, так как я не хочу извлекать все данные из базы данных. Поэтому я хочу по возможности избегать использования IQueryable.ToList () .

5
задан Taryn 12 June 2012 в 17:04
поделиться