Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用参数创建新线程时索引超出范围?_C#_Multithreading_Indexoutofboundsexception - Fatal编程技术网

C# 使用参数创建新线程时索引超出范围?

C# 使用参数创建新线程时索引超出范围?,c#,multithreading,indexoutofboundsexception,C#,Multithreading,Indexoutofboundsexception,我正在做一个关于烘焙算法的项目,但我没有任何C#语言的算法演示。由于这种情况,我转换了一些在维基百科上找到的java代码。但无论如何,它似乎不起作用 更新了:这是我的完整工作代码(旧代码包含在“/”注释中) namespace算法 { 班级计划 { 静态int线程=10; 静态字符串x=“”; 静态整数计数=0; 静态int[]票证=新int[线程]; 静态bool[]输入=新bool[线程]; 公共静态void doLock(内部pid) { 输入[pid]=真; int max=0; 对于(

我正在做一个关于烘焙算法的项目,但我没有任何C#语言的算法演示。由于这种情况,我转换了一些在维基百科上找到的java代码。但无论如何,它似乎不起作用

更新了:这是我的完整工作代码(旧代码包含在“/”注释中)

namespace算法
{
班级计划
{
静态int线程=10;
静态字符串x=“”;
静态整数计数=0;
静态int[]票证=新int[线程];
静态bool[]输入=新bool[线程];
公共静态void doLock(内部pid)
{
输入[pid]=真;
int max=0;
对于(int i=0;i票证[max]){max=i;}
} 
票证[pid]=1+最大值;
输入[pid]=假;
对于(int i=0;i票证[i]||
(票证[pid]==票证[i]&&pid>i)))
{
螺纹屈服强度();
}
}
}
如果(x==“C”| | x==“C”)
Console.WriteLine(“[System]PID”+PID.ToString()+“进入临界区”);
}
公共静态无效解锁(int pid)
{
票证[pid]=0;
计数++;
Console.WriteLine(“[Thread]PID”+PID.ToString()+“进程已完成”);
}
公共静态void arrayInit()
{
对于(int i=0;isimThread(copy));
//导致我的问题的旧代码
//threadArray[i]=新线程(()=>simThread(i));
如果(x==“C”| | x==“C”)
Console.WriteLine(“[System]PID”+i.ToString()+”已创建”);
threadArray[i].Start();
睡眠(20);
}
Console.ReadLine();
Console.WriteLine(“---------------------------------------------”);
WriteLine(“进程完成”+count.ToString()+“线程!”);
计数=0;
Console.WriteLine(“---------------------------------------------”);
WriteLine(“是否要重新启动算法(C=Yes,K=No)”);
choice=Console.ReadLine();
如果(选项==“”)
choice=“C”;
}
}
}
}
这就是问题所在:

threadArray[i] = new Thread(() => simThread(i));
您在这里捕获的是
i
——单个变量,该变量将在循环过程中更新,最终的值为
threads

如果线程只在循环完成后执行lambda表达式的主体,那么该值基本上是不合适的。。。即使没有,您也可以轻松地使用相同的
i
值创建多个线程

您基本上希望循环的每个迭代都有一个单独的变量,例如

for (int i = 0; i < threads; i++)
{
    int copy = i;
    threadArray[i] = new Thread(() => simThread(copy));
    Console.WriteLine("[He Thong] PID " + i.ToString() + " duoc khoi tao");
    threadArray[i].Start();
}
for(int i=0;isimThread(copy));
Console.WriteLine(“[He Thong]PID”+i.ToString()+“duoc khoi tao”);
threadArray[i].Start();
}
这样,循环的每次迭代都会捕获一个单独的变量,该变量的值为该迭代的
i
,但随后不会更改

这是最小的变化
for (int i = 0; i < threads; i++)
{
    int copy = i;
    threadArray[i] = new Thread(() => simThread(copy));
    Console.WriteLine("[He Thong] PID " + i.ToString() + " duoc khoi tao");
    threadArray[i].Start();
}