wmx605 2022-03-20 14:39 采纳率: 100%
浏览 190
已结题

c# task 多任务 waitall异常,请教如何修改?

具体代码如下:

Task[] tasks = new Task[renwuShu];

            for (int i = 0; i < renwuShu; i++)
            {
                tasks[i] = new Task<DataSet>(() => dobidui(xzhdas[i], das[i], i));
                tasks[i].Start();
            }

            Task.WaitAll(tasks);

提示:IndexOutOfRangeException: 索引超出了数组界限。
截图如下:

img

  • 写回答

2条回答 默认 最新

  • CSDN专家-showbo 2022-03-20 14:59
    关注

    申明一个curi变量存i的值,task中任务使用curi这个变量,不要直接使用i,因为task未执行前i已经循环完毕了,i值为最大值rewuShu,导致越界了

    如果题主学过js,js闭包问题就是和题主这代码一样导致的,js需要做一个闭包或者let申明一个变量,C#可以用临时变量存储起来(类似js的let)

    Task[] tasks = new Task[renwuShu];
    
                for (int i = 0; i < renwuShu; i++)
                {
    var curi=i;/////
                    tasks[i] = new Task<DataSet>(() => dobidui(xzhdas[curi], das[curi], curi));
                    tasks[i].Start();
                }
     
    
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月20日

悬赏问题

  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据
  • ¥15 (关键词-阻抗匹配,HFSS,RFID标签)
  • ¥50 sft下载大文阻塞卡死
  • ¥15 机器人轨迹规划相关问题
  • ¥15 word样式右侧翻页键消失
  • ¥15 springboot+vue 集成keycloak sso到阿里云
  • ¥15 win7系统进入桌面过一秒后突然黑屏
  • ¥30 backtrader对于期货交易的现金和资产计算的问题