我很少懷疑在多線程應用程序中如何共享IEnumerable
和IQueryable
。在多線程應用程序中共享IEnumerable <T>和IQueryable <T>
考慮這段代碼片段。
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()
是異步的,這意味着在所有的所有SomeHandler
所有foreach
文件將並行執行(每個文件在其自己的線程中),IEnumerable
的共享實例是否按預期方式枚舉?這是一個正確的方法嗎?我可以在多個線程中共享相同的IEnumerable
的實例,並且並行枚舉它嗎?
如果我在上面的代碼中使用IQueryable
而不是IEnumerable
會怎麼樣?我應該知道的任何副作用?
如果它不是線程安全的,那麼我應該使用什麼?
請注意,我正在使用IQueryable
進行數據庫查詢,因爲我不想從數據庫中提取所有數據。因此,我想盡可能避免IQueryable.ToList()
。
這仍然取決於SessionFile和Pattern的線程安全性 – sehe 2011-04-15 12:14:04