gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:56:25 26 4
gpt4 key购买 nike

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

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 来处理

  • 保持线程安全
  • 授予标准 IEnumerable 功能
  • 让我的数据处理线程等待新项目,直到 DataBuilder 明确调用 IHaveFinishedPopulatingThanksAndBye(),然后干净地退出循环
  • 允许我有几个其他线程使用相同的约束进行迭代

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

最佳答案

您拥有的是经典的生产者/消费者模式。

您可以使用 ConcurrentQueue<T>或者,可能更好,一个 BlockingCollection<T>

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

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

关于c# - 如何在另一个线程填充它时枚举 IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28566929/

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