c# - 如何计算数组中的事件线程并避免 "collection was modified"错误?

标签 c# multithreading collections

我在 C# ( List<Thread> ) 中有一个线程集合,我想在特定的时间间隔内获得正在积极工作的线程的数量。

目前我在完成时将各个线程设置为空。因此:

private int AliveThreads()
{
    lock (ThreadCollection)
    {
        return ThreadCollection.Count(t => t != null);
    }
}

我正在尝试使用 lock以避免出现错误“集合已修改”,但这不起作用。我仍然不时收到此错误。

还有其他更好的方法吗?

最佳答案

我只想使用联锁计数器;在开始每个线程之前 增加此 (Interlocked.Increment),并让每个线程在退出之前调用 Interlocked.Decrement。然后您可以随时使用 Thread.VolatileRead 来查看有多少是事件的,而无需任何收集。

但是,特别要解决这个问题:如果您使用的是集合,则将项目设置为 null 的线程也应该锁定:

lock(ThreadCollection)
{
    ThreadCollection[index] = null;
}

我觉得柜台干净多了。

关于c# - 如何计算数组中的事件线程并避免 "collection was modified"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9182929/

相关文章:

c# - 在 C# 中使用信号量

multithreading - 并行编码与多线程(在单个CPU上)

c# - 泛型和集合......努力实现

c - 保留 C 库中的 Ruby 对象,避免被垃圾回收

c# - 如何在 C# 中的 foreach 循环内访问集合中的下一个值?

c# - Azure Function 正常运行一段时间后无法加载程序集

c# - 如何告诉 Json.NET 忽略第 3 方对象中的属性?

c# - 根据相对速度和角度找出玩家按下的键

javascript - 将 JS 对象转换为 ArrayBuffer 以传输到/从 web worker 等于瓶颈

java - 在创建时将元素添加到集合