Многопоточность с Linq to SQL

Поскольку исходный поток ( Многопоточность с Linq to SQL ) к настоящему времени стал довольно старым, я решил задать еще один вопрос по похожая тема. Рассмотрим сценарий, в котором DomainService предоставляет множество методов для извлечения данных из базы данных SQL Server. Очевидно, что в многопользовательском сценарии Так почему же, если я помещаю свои последовательные LINQ-запросы в Parallel.Invoke (), все вырывается наружу, и я получаю ужасное «Уже существует открытый DataReader, связанный с этой Командой, который необходимо сначала закрыть». ошибка ...?

Чтобы продемонстрировать, что это работает:

List retVal = new List();

retVal.AddRange(this.DataContext.Table1.Where(w=>w.A==1).Select(s=>new Data{f1=s.D}).ToList());
retVal.AddRange(this.DataContext.Table1.Where(w=>w.B==2).Select(s=>new Data{f1=s.D}).ToList());
retVal.AddRange(this.DataContext.Table1.Where(w=>w.C==3).Select(s=>new Data{f1=s.D}).ToList());

... но это не так:

List retVal = new List();
Parallel.Invoke(
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.A==1).Select(s=>new Data{f1=s.D}).ToList()),
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.B==2).Select(s=>new Data{f1=s.D}).ToList()),
()=>retVal.AddRange(this.DataContext.Table1.Where(w=>w.C==3).Select(s=>new Data{f1=s.D})).ToList());

Не обращайте внимания ни на секунду, что List не является потокобезопасным, так как ошибка приближается из соединения данных SQL.

Мы будем очень благодарны за любые идеи и объяснения.

6
задан Community 23 May 2017 в 12:15
поделиться