gpt4 book ai didi

C#:如何使 IEnumerable 线程安全?

转载 作者:IT王子 更新时间:2023-10-29 03:59:05 26 4
gpt4 key购买 nike

假设我有这个简单的方法:

public IEnumerable<uint> GetNumbers()
{
uint n = 0;
while(n < 100)
yield return n++;
}

你如何使这个线程安全?我的意思是,您将获得该枚举器一次,并让多个线程处理所有数字,而不会出现重复数字。

我想某处需要使用锁,但该锁必须在哪里才能使迭代器 block 是线程安全的?一般来说,如果你想要线程安全,你需要记住什么 IEnumerable<T> ?或者更确切地说,我猜这将是一个线程安全的 IEnumerator<T> ...?

最佳答案

这样做存在一个固有的问题,因为 IEnumerator<T>兼有MoveNext()Current .你真的想要一个电话,例如:

bool TryMoveNext(out T value)

此时您可以自动移动到下一个元素并获取一个值。实现它并且仍然能够使用 yield可能会很棘手......不过我会考虑一下。我认为您需要将“非线程安全”迭代器包装在一个线程安全的迭代器中,该迭代器以原子方式执行 MoveNext()Current实现上面显示的接口(interface)。我不知道您如何将此接口(interface)包装回 IEnumerator<T>这样你就可以在 foreach 中使用它虽然……

如果您使用的是 .NET 4.0,Parallel Extensions可能能够为您提供帮助 - 不过您需要更多地解释您正在尝试做什么。

这是一个有趣的话题 - 我可能不得不写博客......

编辑:我现在 blogged about it有两种方法。

关于C#:如何使 IEnumerable<T> 线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1605745/

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