在集合中使用c#中的yield仍然无法更新我的集合

时间:2017-06-24 11:46:34

标签: c# multithreading linq ienumerable yield-return

 static List<int> numbers = new List<int>();
    static void Main(string[] args)
    {

        foreach(var number in GetNumbers())
        {
            if (number == 1)
            {
                Thread t = new Thread(() => 
                {
                    numbers.Add(234567);
                });
                t.Start();
            }
            Console.WriteLine(number);
        }

    }



    public static IEnumerable<int> GetNumbers()
    {

        for(int i =0; i <=10;i++)
        {
            numbers.Add(i);
        }
        foreach (var number in numbers)
        {
            yield return number;
        }            

    }

在上面的示例中,我使用yield迭代集合,并在集合中添加了一个项目以获取更新的数字。

我理解修改我们正在迭代的集合抛出集合修改的异常,但是使用IEnumerable,我得到延迟执行,我应该能够添加到主集合中,因为yield会逐个返回数据。

据我所知,删除项目可能会有问题,但添加项目到迭代集合应该不是问题。但是,如果不允许我在上面的示例中看到(即使是延迟执行),如果我有这样的情况怎么办?

&#34;有一个庞大的集合,很多消费者正在使用IEnumerable和yield迭代它。他们拿走每件商品,用这个商品做一些处理。

如果在主列表或集合中添加了任何新项目,那么客户也应该获得最新项目。

1 个答案:

答案 0 :(得分:3)

即使你使用的是收益率,你也在使用内部一个foreach。

Here州:

  

在List上执行多个读取操作是安全的,但是   如果在阅读时修改了集合,则可能会出现问题。

这是这里的根本问题 - 你正在写这个集合(正如foreach所证明的那样)。这是不允许的。

这可能值得一读 - The docs

您可能希望考虑使用ConcurrentBag,ConcurrentQueue或ConcurrentStack作为替代方案。