问题是TotalRows大约是71800,其中workList只返回718,这只是任务的第一个结果。我在那里有WaitAll,但它似乎一完成第一项任务就完成了。
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
有人知道为什么我的列表不和TotalRows一样大吗?
发布于 2017-01-06 13:03:54
“和RowNum <”+ tmplastRecord : tmplastRecord总是718,所以您要求查询总是在tmplastRecord和718之间返回东西,而不是在tmplastRecord和tmplastRecord+tmplastRecord之间返回。我认为您只需更改为“和RowNum <”+ (tmplastRecord + amount)
智者
https://stackoverflow.com/questions/36894008
复制相似问题