У меня мало сомнений относительно того, как общие 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 ()
.