如何在另一个线程填充它时枚举 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 处理
- 保持线程安全
- 授予标准 IEnumerable 功能
- 让我的数据处理线程等待新项目,直到 DataBuilder 明确调用
IHaveFinishedPopulatingThanksAndBye()
,然后干净地退出循环
- 允许我让其他几个线程使用相同的约束进行迭代
我不敢相信 C# 没有在新版本中提供它。但是它叫什么名字呢?
您拥有的是经典 Producer/Consumer 模式。
您可以使用 ConcurrentQueue<T>
或者 BlockingCollection<T>
可能更好
BoundedCapacity 属性 可让您调节(节流)数据流。
它是一个 IEnumerable<T>
但不要像非共享集合一样使用它。 TryTake()
方法是获取数据的最有用方法。
我想要同一台机器上的两个线程,一个用于填充集合,另一个用于在数据可用时从中弹出数据,并在知道结束时停止。 就是不知道用什么合集...
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# 没有在新版本中提供它。但是它叫什么名字呢?
您拥有的是经典 Producer/Consumer 模式。
您可以使用 ConcurrentQueue<T>
或者 BlockingCollection<T>
BoundedCapacity 属性 可让您调节(节流)数据流。
它是一个 IEnumerable<T>
但不要像非共享集合一样使用它。 TryTake()
方法是获取数据的最有用方法。