繁体   English   中英

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

[英]Task.Factory.StartNew() generating object not initialzed error

我有一个简单的功能,可以作为任务工作,只打印数据集的值。 我通过主要功能和索引传递数据集。 问题是我只填充了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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM