gpt4 book ai didi

c# - Task.Factory.StartNew() 生成对象未初始化错误

转载 作者:行者123 更新时间:2023-11-30 21:50:59 26 4
gpt4 key购买 nike

我有这个简单的函数,作为一项任务,它只打印数据集的值。我从主函数和索引传递数据集。问题是我只填充了 2 个数据集索引,但是该函数总是向前跳一个,即在最后一次迭代中它想要开始读取索引 2,该索引未初始化,因此是异常。

for (int i = 0; i < 2; i++)
{
tasks.Add(Task.Factory.StartNew(() => {
int a = i;
showNodeID(dataSet,a);
}));
}

函数是

private static void showNodeID(DataSet[] ds, int a)
{
Console.WriteLine(a.ToString());
Console.WriteLine(ds[a].GetXml());
} //END

在最后一次迭代中,当我打印 1 但是在函数中,如果我打印 a 它将是 2。

最佳答案

我假设您知道在 lambda 闭包中捕获计数器变量的危险,因为您试图通过将计数器分配给局部范围的变量来避免该问题。但是,您的分配发生得太晚了——当任务开始并复制值时,计数器可能已经在下一次迭代时递增了。要正确避免此问题,您需要在任务之前复制值,而不是在任务中:

for (int i = 0; i < 2; i++)
{
int a = i;
tasks.Add(Task.Factory.StartNew(() =>
{
showNodeID(dataSet, a);
}));
}

如果你只需要执行一个并行循环,你也可以使用:

Parallel.For(0, 2, i => showNodeID(dataSet, i));

关于c# - Task.Factory.StartNew() 生成对象未初始化错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35960963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com