2016-04-27 67 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

' 「AND ROWNUM <」 + amount':量始終是718,所以你問查詢總是在'tmplastRecord'和'718'之間返回,而不在'tmplastRecord'和'tmplastRecord + amount'之間。我認爲你只需要改成'「AND RowNum <」+(tmplastRecord + amount)' – Quantic

+0

Omg。這很愚蠢...... –

+0

供將來參考:如果你正在考慮多線程是一個問題,它通常會幫助嘗試它是否也發生*沒有*多線程第一:) – Luaan

回答

1

「AND ROWNUM <」 +量:量始終是718,所以你問的查詢總是tmplastRecord和718之間的返回東西,不是插圖中tmplastRecord和tmplastRecord +量。我認爲你只需要更改爲 「AND ROWNUM <」 +(tmplastRecord +量)

智者