簡體   English   中英

多線程列表AddRange

[英]Multithreading List AddRange

問題是TotalRows大約為71800,其中workList僅返回718,這僅僅是Task的第一個結果。 我在那里有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); 

因此,作為引用的collectTmpTasks.Count返回100,但workList.Count僅為718,其中listLock只是一個靜態的new object()。 如果尚未注意到我正在使用LINQ to SQL

有人知道為什么我的列表與TotalRows的大小不一樣嗎?

“ AND RowNum <” +數量:數量始終為718,因此您要查詢始終返回tmplastRecord和718之間的值,而不是tmplastRecord和tmplastRecord +數量之間的值。 我認為您只需要更改為“ AND RowNum <” +(tmplastRecord +金額)

聰明人

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM