尝试启动多个线程时索引超出数组范围

2024-01-05

我有这段代码,它给了我一个“索引超出了数组的范围”。我不知道为什么会发生这种情况,因为变量i应始终小于数组的长度bla因此不会导致此错误。

private void buttonDoSomething_Click(object sender, EventArgs e)
{
    List<Thread> t = new List<Thread>();

    string[] bla = textBoxBla.Lines;

    for (int i = 0; i < bla.Length; i++)
    {
        t.Add(new Thread (() => some_thread_funmction(bla[i])));
        t[i].Start();
    }
}

有人可以告诉我如何解决这个问题以及为什么会发生这种情况。谢谢!


Closures你的问题在这里吗?

基本上,它不是在创建 lambda 时(在循环中)获取值,而是在需要时获取值。计算机的速度是如此之快,以至于当这种情况发生时,它已经脱离了循环。其值为 3。 这是一个示例(尚未运行):

private void buttonDoSomething_Click(object sender, EventArgs e)
{
    List<Thread> t = new List<Thread>();
    for (int i = 0; i < 3; i++)
    {
        t.Add(new Thread (() => Console.Write(i)));
        t[i].Start();
    }
}

想想你期望的结果是什么。可不可能是012你在想吗?

现在运行它。

结果将是333.

这是一些修改后的代码可以修复它:

private void buttonDoSomething_Click(object sender, EventArgs e)
{
    List<Thread> t = new List<Thread>();
    string[] bla = textBoxBla.Lines;
    for (int i = 0; i < bla.Length; i++)
    {
        int y = i; 
        //note the line above, that's where I make the int that the lambda has to grab
        t.Add(new Thread (() => some_thread_funmction(bla[y]))); 
        //note that I don't use i there, I use y.
        t[i].Start();
    }
}

现在它会工作得很好。这次,当循环结束时,该值超出了范围,因此 lambda 别无选择,只能在循环结束之前获取它。这将为您带来预期的结果,也不例外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试启动多个线程时索引超出数组范围 的相关文章

  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • 避免集合已修改错误

    Issue 我有以下代码 foreach var ItemA in GenericListInstanceB ItemA MethodThatCouldRemoveAnyItemInGenericListInstanceB 显然我得到一个错
  • 具有多重继承的类的 sizeof

    首先 我知道 sizeof 取决于机器和编译器的实现 我使用的是 Windows 8 1 x64 gcc 5 3 0 没有标志传递给编译器 我从大学讲座中得到了以下代码 include
  • Azure 2012 年 10 月 SDK 损坏 UseDevelopmentStorage=true

    有人尝试过使用 usedevelopmentstorage true 连接字符串的 2012 年 10 月 Azure sdk 吗 CloudStorageAccount Parse UseDevelopmentStorage true 抛
  • 使用成员作为实现者来实现接口

    我有实现 IA 的 A 类 现在我需要创建也应该实现 IA 的类 B B 类有 A 类的实例作为成员 有什么方法可以定义A的实例实现B类中的IA吗 interfase IA void method1 void method2 void me
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • 替换 JSON 中的转义字符

    我想用空格替换 JSON 字符串中的 字符 我怎样才能做到这一点 我发现从 JSON 字符串中删除所有转义字符的最简单 最好的方法是将字符串传递到正则表达式 Unescape 方法 此方法返回一个没有转义字符的新字符串 甚至删除了 n t
  • 如何获取带有标头的 XML (

    考虑下面的简单代码 它创建一个 XML 文档并显示它 XmlDocument xml new XmlDocument XmlElement root xml CreateElement root xml AppendChild root X
  • 从窗口内容截取屏幕截图(无边框)

    我正在寻找有关如何使用 C 将表单内容保存在位图中的解决方案 我已经尝试过使用 DrawToBitmap 但它捕获了所有带边框的窗口 这就是这段代码的结果 public static Bitmap TakeDialogScreenshot
  • .Net Core 中的脚手架以及解决方案中的多个项目

    我创建了一个针对 net461 的 Net Core MVC6 应用程序 我使用了一个我非常熟悉的项目结构 其中我将数据 模型和服务类放置在单独的类库项目中 并且 Web 项目引用这些项目 当我尝试搭建控制器时 我收到一条错误 指出我正在搭
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 使用互斥锁来阻止临界区外部的执行

    我不确定我的术语是否正确 但这里是 我有一个由多个线程使用的函数来写入数据 在注释中使用伪代码来说明我想要的内容 these are initiated in the constructor int data std atomic
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • java中wav文件转换为字节数组

    我的项目是 阿塞拜疆语音的语音识别 我必须编写一个程序来转换wav文件到字节数组 如何将音频文件转换为byte 基本上如第一个答案中的片段所描述 但不是BufferedInputStream use AudioSystem getAudio
  • 如何从代码隐藏中向我的 div 添加点击事件?

    如何从代码隐藏中向我的 div 添加点击事件 当我点击 div 时 会出现一个消息框 其中显示 您想删除它吗 并在框中显示 是 或 否 全部来自后面的代码 while reader Read System Web UI HtmlContro
  • 如何使用简历实现一个“一网打尽”的异常处理程序?

    我想知道我怎样才能写一个抓住他们全部应用程序级别的异常处理程序将为用户提供恢复应用程序流程的选项 如果您正在运行 Windows 窗体应用程序 将处理程序添加到Application ThreadException event
  • 使用 roslyn 扩展 C# 语法

    我试图在没有 else 情况的情况下实现 return if return value if 因为我只想在条件有效时返回或返回一个值 我知道 有if condition return or if condition return value
  • 编译器可以报告未知属性的错误吗?即使有范围?

    在N3291 7 6 1 3 5 属性语法和语义 decl attr grammar 关于如何属性是用我读过的源代码写的 使用一个属性范围令牌是有条件支持的 实现定义的行为 and For an 属性标记本国际标准中未指定 该行为是实现定义
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐

  • 使用 protobuf-net 进行惰性、流驱动的对象序列化

    我们正在开发一个用于流式传输大量数据的 WCF 服务 因此我们选择使用WCF 流式传输 http msdn microsoft com en us library ms733742 aspx功能结合protobuf网络 http code
  • 如何区分用户是否处于订阅试用期或不在google play?

    我正在实现一项服务器端服务 用于检查用户的 google play 订阅状态 我使用 Android Publisher API https developers google com android publisher api ref p
  • Rails3 & Git & Heroku - 开发/登台服务器

    我有一个 Rails 3 应用程序 正在与一个使用 Git Github 的团队一起开发 并部署到 Heroku cedar 堆栈 我们的 Github 存储库有 2 个主要分支 Master 和 Development 我想定期将我们的开
  • REST 查询中的 UTF-8 编码字符未正确呈现

    我正在使用一个外部 REST 服务 该服务以 UTF 8 编码提供所有内容 由于某种原因 我的应用程序无法正确处理响应 如果我转储回复 我会看到像 Lule 应该是 Lule 这样的东西 编辑 如果我将字符串转发 不更改 到 UI 也会发生
  • 如何让 toString() 返回多行字符串?

    我正在开发一个程序 该程序搜索数组并找到最小值 然后打印出跑步者的时间 名字和姓氏 我需要弄清楚如何在不同的行上返回三个值 例如 public String toString return String format firstName l
  • Java 同步 String IllegalMonitorStateException

    我试图让 Thread2 等待 String 并让 Thread1 通知 String 更新 我确实同步了 String 对象 如下面的代码所示 但我仍然得到IllegalMonitorStateException这是我的代码 public
  • CreateFile 无法共享串行 (COM) 端口

    The 创建文件 https msdn microsoft com en us library windows desktop aa363858 v vs 85 aspx函数对于打开文件或设备进行读 写访问非常有用 提供句柄 第三个参数 d
  • 失去与 Net::SSH::Perl 的连接

    解决方案如下 我们有一个 ETL 系统 它将数据提取到 CSV 中 将其上传到另一台服务器 然后需要连接到另一台服务器并调用 java jar 将 csv 加载到 memcache 中 我有一个脚本可以执行其中的每一步 但在最后一步会丢失
  • @Lazy 注解和标签的lazy-init属性有什么区别?

    根据我的理解 Lazy注释和标签的lazy init属性应该具有相同的功能 但是当我开发以下代码时 它显示出不同的行为 在下面的代码中 我期待 循环依赖错误 org springframework beans factory BeanCur
  • glmer 与用户定义的链接函数给出错误:(maxstephalfit) PIRLS 步减半未能减少偏差

    在尝试将用户定义的链接函数与随机效应 glmer 结合使用时 我遇到了一个我不知道如何解决的错误 Error maxstephalfit PIRLS step halvings failed to reduce deviance in pw
  • 当输入文本文件更改时重新启动 Spring Boot

    在这里扩展问题 在 Spring Boot 中启动时从文件中读取数据以在控制器中使用 https stackoverflow com questions 43424524 reading data from file at start to
  • Heroku config:push 不更新环境变量

    我已经将一个应用程序部署到 Heroku 并且当前将环境变量存储在 env 文件中 我用了heroku config push将变量推送到heroku 效果很好 现在 我想更新其中之一 我在 env 文件中更改了它 然后运行heroku c
  • 如何使用 sqoop 在 Hive 中创建外部表。需要建议

    使用 sqoop 我可以创建托管表 但不能创建外部表 请让我知道从数据仓库卸载数据并将其加载到 Hive 外部表中的最佳实践是什么 1 仓库中的表是分区的 有些是按日期分区 有些是按状态分区 请将您的想法或做法应用于生产环境 Sqoop 不
  • 使用 Python 旋转 EXIF 中指定的方向的图像,无需 PIL(包括缩略图)

    我有以下场景 我正在将 iPhone 上的图像连同 EXIF 信息一起发送到我的 Python 套接字服务器 我需要根据拍摄图像时的实际方向正确定位图像 我知道 IOS 总是将图像保存为横向左并将实际方向添加为 EXIF 字段 EXIF I
  • Android:是否可以用数字更新 ImageView/ImageButton 以显示新消息的数量?

    在 iOS 中 我们有一个功能 可以通过在图标的右上角显示一个小数字来为用户更新应用程序图标 并添加新的待处理消息 类似地 我想知道我们是否有方法来更新 ImageView ImageButton在android中 这里我不想更新主屏幕上的
  • 如何在拉取/合并请求之前更新(拉取)分支?

    例如 假设我有一个名为develop 我的所有功能都将是从创建的分支develop稍后我需要执行合并请求 在 GitLab 中 在 GitHub 中将是拉取请求 如果我需要在将新分支推入之前更新它origin并执行合并 拉取请求 git p
  • WebDriverError 错误:Chrome 无法启动:异常退出

    我正在尝试在 ubuntu 14 04 虚拟机上运行量角器测试 通过谷歌云 由于某种原因 当我运行 量角器conf js 时 我收到一条错误消息 E 启动器 WebDriverError 未知错误 Chrome 无法启动 异常退出 我按照此
  • iPhone SDK:锁定方向

    我在以前的应用程序中看到过它 忘记应用程序名称 您可以在其中锁定屏幕的当前方向 有没有一种简单的方法可以完成此操作 例如 只需使用按钮即可 只需将 ivar 添加到您的应用程序委托即可通过按锁定按钮进行设置 然后在所有视图控制器中 您只需检
  • 如何在 Mac 上安装 sshpass?

    我想从我的 Mac 自动进行 ssh 登录 它确实有一个简单的解决方案 sshpass p my password ssh m username hostname 但我的问题是在我的 Mac 上安装 sshpass 2022 年更新 不幸的
  • 尝试启动多个线程时索引超出数组范围

    我有这段代码 它给了我一个 索引超出了数组的范围 我不知道为什么会发生这种情况 因为变量i应始终小于数组的长度bla因此不会导致此错误 private void buttonDoSomething Click object sender E