我试图根据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);
}这是输出startRange 1 EndRange 785761 startRange 785762 EndRange 1571522 startRange 1571523 EndRange 2357283 startRange 2357284 EndRange 3143047
线程3任务startRange 2357284 EndRange 3143047线程5任务startRange 2357284 EndRange 3143047线程4任务startRange 2357284 EndRange 3143047线程6任务startRange 2357284 EndRange 3143047
发布于 2013-09-03 02:52:40
小心使用ref参数并将它们传递给不同线程上的任务。我认为,当任务查看值时,它已经在另一个线程上被更改了。ie您的StartWork方法正在查看startRange/endRange的当前值,该值一直在被更改。
尝试这样做:
for (int i = 0; i < taskCount; i++)
{
GetRanges(ref startRange, ref endRange, total, i, startIndex);
Console.WriteLine("startRange {0} EndRange {1}", startRange, endRange);
var tempStartRange = startRange;
var tempEndRange = endRange;
tasks[i] = Task.Factory.StartNew(() => StartWork(tempStartRange, tempEndRange));
}https://stackoverflow.com/questions/18582852
复制相似问题