IndexOutOfRangeException exception when using task

2020-02-29 08:38发布

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?

标签: c# loops task
1条回答
混吃等死
2楼-- · 2020-02-29 09:15

try copying ii to a local variable inside the for loop.

Task[] tasks = new Task[strarrFileList.Length];
for (int ii = 0; ii < strarrFileList.Length; ii++)
{
    var currentIndex = ii;
    tasks[currentIndex] = Task.Run(() => mResizeImage2(currentIndex, strarrFileList[currentIndex], intLongSide, jgpEncoder, myEncoderParameters));
}
Task.WaitAll(tasks);

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

查看更多
登录 后发表回答