列出并发删除和添加

我不太确定,所以我想我会问。 将项目删除并添加到System.Collections.Generic.List对象是非线程安全的吗?

我的情况:

收到连接后,它会被添加到列表中,但同时也会有一个正在删除死连接的工作人员等。

有问题吗? 会lock吗? 我也想知道我是否可以使用它的Foreach方法对列表对象使用锁。

是的,在List<>添加和删​​除项目不是线程安全的,因此您需要同步访问权限,例如使用lock

请注意, lock关键字不会锁定您用作标识符的对象,它只会阻止两个线程同时进入同一个代码块。 您将需要使用标识符相同的对象来访问访问列表的所有代码。

在提出问题时还没有.NET Framework 4,但现在面临问题的人应该尝试使用System.Collections.Concurrent命名空间中的集合来处理线程安全问题

List不是线程安全的,所以是的,您需要使用锁来控制对列表的访问。 如果你有多个线程访问列表,请确保你让他们都尊重锁,否则你会遇到问题。 执行此操作的最佳方法是将List子类化,以便锁定自动发生,否则您最终可能最终会忘记。

实际上,根据微软的说法,有时List <>是线程安全的,有时候不是。

此类型的公共静态成员是线程安全的。 任何实例成员都不保证是线程安全的。

但那页继续说:

枚举集合本质上不是线程安全的过程。 在枚举与一个或多个写访问争用的极少数情况下,确保线程安全的唯一方法是在整个枚举期间锁定集合。 要允许多个线程访问集合以进行读取和写入,您必须实现自己的同步。

绝对使用锁定特定代码使其线程安全,但我不同意它当前的情况。

您可以实现Synchronized方法以使收集线程安全。 此链接解释了为什么以及如何执行此操作。

在这个链接中提到了另一个纯粹的编程方法,虽然我从来没有亲自测试它但它应该工作。

顺便说一下,最重要的一个问题是,你是否想要自己维护类似连接池的东西? 如果是,那么为什么?

我接受了我的回答。 使用锁定更好地回答使用此方法。