2016-04-27 4 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' 'tmplastRecord'と' tmplastRecord + amount'の間ではなく 'tmplastRecord'と' 718'との間で常に物事を返すように問い合わせます。あなたは '' AND RowNum <」+(tmplastRecord + amount) ' – Quantic

+0

Omgに変更するだけでいいと思います。それは愚かだった... –

+0

将来の参考として:もしあなたが問題になるマルチスレッドを検討しているなら、それも*マルチスレッド化せずに*起こる場合に試してみるのが普通です:) – Luaan

答えて

1

"AND ROWNUM <" +金額:金額は常に718であるので、あなたは常に、NOT tmplastRecordとtmplastRecord +量わたってるしき、tmplastRecordと718の間で物事を返すために、クエリを求めています。量は常に718であるので、あなたが求めている:私はあなただけに変更する必要があると思う "AND ROWNUM <" +(tmplastRecord +量)

ワイズ男

関連する問題