List Index Out of Range exception when creating a task

后端 未结 3 2077
没有蜡笔的小新
没有蜡笔的小新 2020-12-20 11:53

The exact error:

Index was out of range. Must be non-negative and less than the size of the collection.

I\'ve index arrays and l

3条回答
  •  萌比男神i
    2020-12-20 12:38

    You're the victim of accessing modified closure, as it's so succinctly called. Basically, since you're using a task - and a delegate to boot - the value of i is not guaranteed to be what it is you expect it to be. If you, however, copy i to a local variable, specific for the scope of one, single iteration, you should be fine.

    for (int i = 0; i < addressList.Count; i++)
    {
        textBox1.Text += ("Task for " + addressList[i] + ":" + portList[i] + " initiated." + Environment.NewLine);
    
        var iCopy = i;
        Task.Factory.StartNew(() => PingTaskAdapted(addressList[iCopy], portList[iCopy]));
    }
    


    However, as pointed out in this answer by nvoigt, it's far more clear when it comes to readability and maintainability if you copy the values which will be used rather than the iterator value.

提交回复
热议问题