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と同じサイズではないと思う人は誰ですか?
' "AND ROWNUM <" + amount' 'tmplastRecord'と' tmplastRecord + amount'の間ではなく 'tmplastRecord'と' 718'との間で常に物事を返すように問い合わせます。あなたは '' AND RowNum <」+(tmplastRecord + amount) ' – Quantic
Omgに変更するだけでいいと思います。それは愚かだった... –
将来の参考として:もしあなたが問題になるマルチスレッドを検討しているなら、それも*マルチスレッド化せずに*起こる場合に試してみるのが普通です:) – Luaan