ID 範囲に基づいて複数のタスク間で作業を分割しようとしています 。i に基づいて開始範囲と終了範囲を取得するこのメソッドがあります。GetRanges メソッドが範囲をタスクに正しく分割していることがわかります。ただし、タスクが StartWork(startRange, endRange) と呼ばれると、すべてのタスクが同じ範囲に設定されることもあれば、2 つまたは 3 つの重複する範囲が設定されることもあります。 非同期タスクの開始時に、基本的に一意の startrange と endRange が渡されていませんか? どうすれば修正できますか?
int endRange = 0;
int startRange = 0;
int total = GetTotal();
int startIndex =1;
for (int i = 0; i < taskCount; i++)
{
GetRanges(ref startRange, ref endRange, total, i, startIndex);
Console.WriteLine("startRange {0} EndRange {1}", startRange, endRange);
tasks[i] = Task.Factory.StartNew(() => StartWork(startRange, endRange));
}
private void StartWork(int startRange, int endRange)
{
Console.WriteLine("Thread {0} task startRange {1} EndRange {2}", System.Threading.Thread.CurrentThread.ManagedThreadId, startRange, endRange);
}
private void GetRanges(ref int startRange, ref int endRange, int total, int threadIndex, int startIndex)
{
int averagetask = (total - startIndex) / taskCount;
startRange = (averagetask * threadIndex) + 1;
if (threadIndex == taskCount - 1)
endRange = total;
else
endRange = averagetask * (threadIndex + 1);
}
出力は次のとおりです。
スレッド 3 タスク startRange 2357284 EndRange 3143047 スレッド 5 タスク startRange 2357284 EndRange 3143047 スレッド 4 タスク startRange 2357284 EndRange 3143047 スレッド 6 タスク startRange 2357284 EndRange 3143047