gpt4 book ai didi

c# - 线程安全的OfType

转载 作者:行者123 更新时间:2023-12-03 12:48:22 26 4
gpt4 key购买 nike

我面对的是这段代码的问题:

enumerable.OfType<Foo>().Any(x => x.Footastic == true);

Isnt线程安全并抛出枚举已更改的异常。

有解决这个问题的好方法吗?

已经尝试了以下方法,但它并不总是有效(似乎不经常触发)
public class Foo
{
public void DoSomeMagicWithCollection(IEnumerable enumerable)
{
lock (enumerable)
{
enumerable.OfType<Foo>().Any(x => x.Footastic == true);
}
}
}

最佳答案

如果您在枚举时发现基础集合已发生更改,这是一个异常(exception),因为这段代码显然不会改变集合本身,则意味着在您尝试对其进行迭代时,另一个线程正在对该集合进行变异。

除了简单地不执行之外,没有其他解决方案。发生的是List的枚举数(或任何其他收集类型)抛出异常并阻止了进一步的枚举,因为它可以看到列表在枚举期间被修改。包裹它的OfTypeAny枚举数无法从中恢复。基础枚举器拒绝向他们提供列表中的数据。他们对此无能为力。

您需要使用某种同步机制来防止另一个线程使该线程枚举此集合的wntle突变。您的lock不会阻止另一个线程使用该集合,而只是阻止运行锁定在同一实例上的任何代码。您需要具有任何可能使列表发生变异的代码,并将它们锁定在同一对象上以正确同步它们。

另一种可能性是使用一个固有设计为可以同时从多个线程访问的集合。 System.Collections.Concurrent命名空间中有几个这样的集合。它们可能符合您的需求,也可能不符合您的需求。他们将负责自己同步对数据的访问(到某个点),而无需在访问它们时显式锁定。

关于c# - 线程安全的OfType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22044996/

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