c# - 多线程程序中的 IndexOutOfRange 异常

标签 c# multithreading exception indexoutofboundsexception

我不太喜欢多线程编程,当我试图在我的代码中实现它时,遇到了一个我无法弄清楚原因的异常。在这方面的任何帮助将不胜感激:)
所以,基本上我有这么一小段代码:

string[][] Array1 = new string[thread_count][];

/* Logic to insert data in Array1 */

Thread[] WorkerThreads = new Thread[thread_count];

for (int i = 0; i < thread_count; i++)
{
    /* THE EXCEPTION OCCURS IN THE FOLLOWING LINE */
    WorkerThreads[i] = new Thread(() => GetVal(Array1[i], val, num));
    WorkerThreads[i].Start();
}

for (int i = 0; i < WorkerThreads.Length; i++)
    WorkerThreads[i].Join();  

现在,thread_count 的值设置为 10,我收到了一个 IndexOutOfRange 异常。调试器将 i 的值显示为 10,Array1[10][] 是它试图访问的值。
当循环不应该运行那么远时,我不知道 i 的值如何达到 10。
谁能指出我哪里出错了?我正在使用 C#。

谢谢

最佳答案

你有“关闭循环变量”的问题,检查这个:closing over the loop variable considered harmfulThe foreach identifier and closures .

添加一个临时变量来修复它:

for (int i = 0; i < thread_count; i++)
{
    var j = i;
    /* THE EXCEPTION OCCURS IN THE FOLLOWING LINE */
    WorkerThreads[j] = new Thread(() => GetVal(Array1[j], val, num));
    WorkerThreads[j].Start();
}

关于c# - 多线程程序中的 IndexOutOfRange 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18071384/

相关文章:

php - 如何处理PHP 5.4中的方法引发的异常?

c# - 从 3.4 alpha 升级到 Microsoft.IdentityModel.Clients.ActiveDirectory 3.10

linux - linux下如何摆脱死锁

C#:列表对象的不可变 View ?

c# - 如何等到 await/async 方法完成

python - 如何使用多处理有效地将数据从一个数据库表插入到另一个数据库表?

python - 无法在 Selenium 中定位元素时设置默认异常处理程序?

Delphi - 编译器保证 try finally block 正确执行?

c# - TFS API : Retrieve changesets from main branch using VersionControlServer. 查询历史记录

c# - 关于如何将运行时属性与类中的其他属性分开的最佳实践