2016-04-27 2 views
0

Проблема заключается в том, что TotalRows составляет около 71800, где workList возвращает только 718, что является только первым результатом задачи. У меня есть WaitAll, но, похоже, он заканчивается, как только выполняется первая задача.Список многопотоков AddRange

TotalRows = GetRowCount(); 
     var lastRecord = 0; 
     List<tmpWBITEMALL> workList = new List<tmpWBITEMALL>(); 
     for (int i = 0; i < 100; i++) 
     { 
      var tmpI = i; 
      gatherTmpTasks.Add(Task.Factory.StartNew(() => 
      { 
       var context = new AS400_PIM5ContextDataContext(); 
       context.CommandTimeout = 0; 
       int amount = (TotalRows/100); 
       int tmplastRecord = lastRecord; 
       Interlocked.Add(ref lastRecord, amount); 
       Console.WriteLine("Getting rows " + tmplastRecord+ " to " + (tmplastRecord + amount)); 
       var pagedResult = context.ExecuteQuery<tmpWBITEMALL>("SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY Id) AS RowNum, * from tmpWBITEMALL) AS RowConstrainedResult WHERE RowNum >= " + tmplastRecord+ " AND RowNum < " + amount + " ORDER BY RowNum"); 
       lock (listLock) 
        workList.AddRange(pagedResult); 
       context.Dispose(); 
      })); 
     } 
     Task.WaitAll(gatherTmpTasks.ToArray()); 
     Console.WriteLine("total work: " + workList.Count + " tasks: " + gatherTmpTasks.Count); 

Так как справка gatherTmpTasks.Count возвращает 100, но workList.Count только 718, где, как listLock только статический новый объект(). Если я не заметил, что я использую LINQ to SQL

У кого-нибудь есть идеи, почему мой список не такой же, как TotalRows?

+1

' "И RowNum <" + amount': сумма всегда 718, так что вы просите запрос всегда возвращать вещи между 'tmplastRecord' и' 718', а не между 'tmplastRecord' и' tmplastRecord + amount'. Я думаю, вам просто нужно перейти на '' AND RowNum <"+ (tmplastRecord + amount)' – Quantic

+0

Omg. Это было глупо ... –

+0

Для справки в будущем: если вы рассматриваете проблему с несколькими потоками, это может помочь, если это также произойдет * без * многопоточности в первую очередь :) – Luaan

ответ

1

«И RowNum <» + сумма: сумма всегда 718, поэтому вы задаете запрос всегда возвращать вещи между tmplastRecord и 718, НЕ tmplastRecord и между ними tmplastRecord + количество. Я думаю, вам просто нужно изменить, чтобы "И RowNum <" + (tmplastRecord + сумма)

Мудрец

Смежные вопросы