如何在另一个线程填充它时枚举 IEnumerable

How to enumerate an IEnumerable while another thread populates it

我想要同一台机器上的两个线程,一个用于填充集合,另一个用于在数据可用时从中弹出数据,并在知道结束时停止。 就是不知道用什么合集...

private void DataProviderThread()
{
    GlobalCollection = new SomeMagicCollection();

    for (int i = 0; i < 100; i++)
    {
        GlobalCollection.Add(new SomeDataItem(i));
        Thread.Sleep(100);
    }

    GlobalCollection.IHaveFinishedPopulatingThanksAndBye();
}

private void DataCruncherThread()
{
    foreach (var item in GlobalCollection)
    {
        // Do whatever
    }
    // The control should exit foreach only once the data provider states that the collection is finished  
}

然后我想简单地迭代它,让 Collection 处理

我不敢相信 C# 没有在新版本中提供它。但是它叫什么名字呢?

您拥有的是经典 Producer/Consumer 模式。

您可以使用 ConcurrentQueue<T> 或者 BlockingCollection<T>

可能更好

BoundedCapacity 属性 可让您调节(节流)数据流。

它是一个 IEnumerable<T> 但不要像非共享集合一样使用它。 TryTake() 方法是获取数据的最有用方法。