gpt4 book ai didi

.net-4.0 - foreach 是在 C# 中使用 BlockingCollection 的唯一方法吗?

转载 作者:行者123 更新时间:2023-12-04 20:01:11 26 4
gpt4 key购买 nike

我现在开始与 TPL 合作。我在 this video 中看到了一个使用 TPL 的简单版本的生产者/消费者模型。

这是问题所在:

以下代码:

BlockingCollection<Double> bc = new BlockingCollection<Double>(100);
IEnumerable<Double> d = bc.GetConsumingEnumerable();

返回一个 IEnumerable<Double>,它可以使用 foreach 进行迭代(并自动消耗):
foreach (var item in d)
{
// do anything with item
// in the end of this foreach,
// will there be any items left in d or bc? Why?
}

我的问题是:
  • 如果我从 IEnumerator<Double> dEnum = d.GetEnumerator() 得到 d(例如,用 d 循环遍历 while) d.MoveNext() 也会消耗列表吗? (我的回答:我不这么认为,因为 dEnum 没有与 d 链接,如果你知道我的意思。所以它会消耗 dEnum ,但不是 d ,甚至 0x1045067)840679
  • 我可以以 bc 循环以外的方式循环 bc(或 d ),消耗这些项目吗? (foreach 循环比 while 循环快得多,我担心科学计算问题的性能问题)
  • foreach 类型中的消耗到底是什么意思?

  • 例如,代码:
    IEnumerator<Double> dEnum = d.GetEnumerator();
    while (dEnum.MoveNext())
    {
    // do the same with dEnum.Current as
    // I would with item in the foreach above...
    }

    谢谢大家!

    最佳答案

    foreach 没有“性能问题” .与仅使用 foreach 相比,直接使用枚举器不太可能给您带来任何可衡量的性能改进。直接循环。

    话虽如此, GetConsumingEnumerable() 返回标准 IEnumerable<T> ,因此您可以以您选择的任何方式枚举它。获取 IEnumerator<T>并通过它直接枚举仍然以相同的方式工作。

    请注意,如果您不想使用 GetConsumingEnumerable() ,你可以使用 ConcurrentQueue<T> 直接地。默认情况下,BlockingCollection<T>包裹一个 ConcurrentQueue<T> ,并且实际上只是提供了一个更简单的 API ( GetConsumingEnumerable() ) 来简化生产者/消费者场景的编写。使用 ConcurrentQueue<T>直接使用更接近于 BlockingCollection<T>不使用枚举。

    关于.net-4.0 - foreach 是在 C# 中使用 BlockingCollection<T> 的唯一方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12752198/

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