I am trying to use tasks in a for loop, but I am getting really strange exception! here is my code:
Task[] tasks = new Task[strarrFileList.Length];
for (int ii = 0; ii < strarrFileList.Length; ii++)
{
tasks[ii] = Task.Factory.StartNew(() => mResizeImage2(ii, strarrFileList[ii], intLongSide, jgpEncoder, myEncoderParameters));
}
Task.WaitAll(tasks);
Here is the error:
An exception of type 'System.IndexOutOfRangeException' occurred in mCPanel.exe but was not handled in user code Additional information: Index was outside the bounds of the array.
So basically ii becomes equal to strarrFileList.Length which shouldn't! Does anyone have an explanation/solution for this?
try copying ii to a local variable inside the for loop.
This is needed because you are accessing a modified closure. For example, since Task.Run() will not run right away, and you are simply just passing ii to it (w/out copying it locally), the value of ii may change when the ThreadPool does decide to run that particular Task. More info, see Access to Modified Closure