C# lambda表达式中的不可能值
谁能告诉我,这个代码怎么可能:C# lambda表达式中的不可能值,c#,arrays,concurrency,lambda,C#,Arrays,Concurrency,Lambda,谁能告诉我,这个代码怎么可能: for (byte i = 0; i < someArray.Length; i++) { pool.QueueTask(() => { if (i > 0 && i < someArray.Length) { myFunction(i, someArray[i], ID); } }
for (byte i = 0; i < someArray.Length; i++)
{
pool.QueueTask(() =>
{
if (i > 0 && i < someArray.Length)
{
myFunction(i, someArray[i], ID);
}
});
}
for(字节i=0;i
{
if(i>0&&i
位于使用indexootfrangeexception
调用myFunction
的行上,因为i
变量的值等于someArray.Length
?我真的不明白
注意:pool
是包含2个线程的简单线程池的实例
注2:for循环中的类型
byte
是有意放置的,因为数组长度不能超过byte max值(根据前面创建数组的逻辑),我需要变量I
为byte
类型,使用byte
作为索引似乎是过早的微优化,如果您的数组包含的元素超过255个,那么它确实会带来麻烦
此外,当我们这样做时:您提到您正在线程池上运行。您是否确保
someArray
在代码运行时不会超出范围?您的代码正在i
上创建一个闭包,并且每次执行时它都将成为someArray.Length
。最后传递到QueueTask()
的操作
保留for循环的状态,并在执行时使用i
的值。这是一个可编译的代码示例,它表达了同样的问题
static void Main(string[] args)
{
var someArray = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var fns = new List<Action>();
for (int i = 0; i < someArray.Length; i++)
{
fns.Add(() => myFunction(i, someArray[i]));
}
foreach (var fn in fns) fn();
}
private static void myFunction(int i, int v)
{
Console.WriteLine($"{v} at idx:{i}");
}
相关阅读:您的数组包含的元素不超过256个,是吗?@Flynn1179它包含100个元素(这就是为什么我使用byte)byte比int慢。@M.kazemAkhgary实际上,我使用byte是因为避免了从int到byte的转换。该函数接受第一个参数字节,它作为某些数据结构的数据值,我将其存储在具有自定义布局的二进制文件中-一个字节,一个长,等等。。。谢谢你的努力,但这不适用于我的情况。@Sehnsucht-谢谢!实际上,C#5.0和
foreach
循环有一个相关的突破性变化,这可能也会引起您的兴趣。
static void Main(string[] args)
{
var someArray = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var fns = new List<Action>();
for (int i = 0; i < someArray.Length; i++)
{
var local = i;
fns.Add(() => myFunction(local, someArray[local]));
}
foreach (var fn in fns) fn();
}
private static void myFunction(int i, int v)
{
Console.WriteLine($"{v} at idx:{i}");
}